1

I am trying to match the word contact within content/text of html tags. I can get all text between tags:

http://rubular.com/r/IkhG2nhmnS

with:

(?<=\"\>)(.*?)(?=\<\/)

But I want to search for only the word contact, it doesn't work:

http://rubular.com/r/We44nHisLf

with:

(?<=\"\>)(contact*?)(?=\<\/)

Can anyone guide how do I match the word I want within the text/content of html tags. In above case I want to find/match the word contact

Thanks for your help

4

4 回答 4

3

描述

此正则表达式将拉取锚标记中 href 内的所有文本。

<a\b[^>]*?\bhref=(['"])([^'"]*)\1[^>]*?>

在此处输入图像描述

团体

<a组 0 将具有从到 的整个匹配字符串>

  1. 接收 href 部分的公开报价。这稍后在正则表达式中\1用于匹配关闭引号
  2. 接收href值的内容

免责声明

使用正则表达式可能不是解析 HTML 的好主意,因为有许多边缘情况可能会导致正则表达式出错。

PHP 代码示例:

<?php
$sourcestring="your source string";
preg_match_all('/<a\b[^>]*?\bhref=([\'"])([^\'"]*)\1[^>]*?>/im',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

$matches Array:
(
    [0] => Array
        (
            [0] => <a href="contact">
        )

    [1] => Array
        (
            [0] => "
        )

    [2] => Array
        (
            [0] => contact
        )

)

概括

  • <a 匹配<a
  • \b 单词 char (\w) 和非单词 char 之间的边界
  • [^>]*? 任何字符,除了:'>'(0 次或多次(匹配尽可能少的数量))
  • \b 单词 char (\w) 和非单词 char 之间的边界
  • href= 匹配href=
  • ( 分组并捕​​获到 \1:
  • ['"] 任何字符:''', '"'
  • ) \1 结束
  • ( 分组并捕​​获到 \2:
  • [^'"]* 任何字符,除了:'''、'"'(0 次或多次(匹配尽可能多的数量))
  • ) \2 结束
  • \1 捕获 \1 匹配的内容
  • [^>]*? 任何字符,除了:'>'(0 次或多次(匹配尽可能少的数量))
  • > 匹配>
  • ) 分组结束
于 2013-05-28T13:47:42.107 回答
2

你可能想要这样的东西

(?<=\"\>).*(contact)?(?=\<\/)

您当前的正则表达式:

(?<=\"\>)(contact*?)(?=\<\/)

只会匹配:

<a href="contact">contact</a>

但是也...

<a href="contact">contactttt</a>

甚至...

<a href="contact">contac</a>

由于*仅适用于t前面的它。

我的.*正则表达式中的 允许之前的任何字符contact

于 2013-05-28T13:38:19.583 回答
2

确保在匹配文本之前不会遇到另一个标签的最安全方法是:

(?<=\"\>)[^<]*(contact)

在哪里

[^<]* 

表示:(一个不是<的字符),尽可能多次

于 2013-05-28T13:49:23.167 回答
1

如果你真的必须使用正则表达式来解析 HTML 标签,那么

(?<=>)[^<]*(contact)[^<]*(?=<\/)

这是一个测试。您的比赛在第 1 组。

但是请查看DOM 函数,以正确解析结构化文档。

于 2013-05-28T13:38:18.460 回答