3

我正在寻找 PHP 中的正则表达式,它将锚点与特定文本匹配。例如,我想获得带有文本 mylink 的锚点,例如:

<a href="blabla" ... >mylink</a>

所以它应该匹配所有的锚,但前提是它们包含特定的文本所以它应该匹配这些字符串:

<a href="blabla" ... >mylink</a>

<a href="blabla" ... >blabla mylink</a>

<a href="blabla" ... >mylink bla bla</a>

<a href="blabla" ... >bla bla mylink bla bla</a>

但不是这个:

<a href="blabla" ... >bla bla bla bla</a>

因为这个不包含单词mylink。

这个也不应该匹配:"mylink is string"因为它不是锚。

有人有什么想法吗?

感谢花岗岩

4

4 回答 4

9

尝试使用解析器:

require_once "simple_html_dom.php";

$data = 'Hi, I am looking for a regular expression in PHP which would match the anchor with a 
specific text on it. E.g I would like to get anchors with text mylink like: 
<a href="blabla" ... >mylink</a>

So it should match all anchors but only if they contain specific text So it should match t
hese string:

<a href="blabla" ... >mylink</a>

<a href="blabla" ... >blabla mylink</a>

<a href="blabla" ... >mylink bla bla</a>

<a href="blabla" ... >bla bla mylink bla bla</a>

but not this one:

<a href="blabla" ... >bla bla bla bla</a> Because this one does not contain word mylink.

Also this one should not match: "mylink is string" because it is not an anchor.

Anybody any Idea? Thanx Granit';

$html = str_get_html($data);

foreach($html->find('a') as $element) {
  if(strpos($element->innertext, 'mylink') === false) {
    echo 'Ignored: ' . $element->innertext . "\n";
  } else {
    echo 'Matched: ' . $element->innertext . "\n";
  }
}

产生输出:

Matched: mylink
Matched: mylink
Matched: blabla mylink
Matched: mylink bla bla
Matched: bla bla mylink bla bla
Ignored: bla bla bla bla

下载simple_html_dom.php地址:http ://simplehtmldom.sourceforge.net/

于 2009-11-02T13:16:49.917 回答
1

这应该可以工作(构建正则表达式字符串并插入您需要的任何字符串而不是“mylink”)

<\s*a\s+[^>]*>[^<>]*mylink[^<>]*<\s*\/a\s*>

但这不推荐。您应该改用 HTML 解析器并处理标签。正则表达式并不是真正合适的工具。(如果您的链接包含“>”,则上述正则表达式将不起作用,尽管这可能很少见)

如果您只使用适当的环绕,我认为 php 不需要任何特殊的转义字符。

在 regexpal.com 测试

一些注意事项::
\s* - 匹配可选空格
\s+ - 匹配至少一个空格/制表符和任何额外的可选空格
[^>] - 匹配除 '>' 之外的任何字符
[^<>]- 匹配除'>'之外的任何字符'<' 或 '>'

更新:为与 m/regex/ 匹配的 php 转义了“/”

于 2009-11-02T13:09:50.080 回答
0
if (preg_match('%<\s*a\s+href="blabla"[^>]*>(.*mylink.*)<\s*/a>%', $text, $regs)) {
    $result = $regs[1];
} else {
    $result = "";
}

$regs[0]将保持完整匹配 $regs[1]将保持 a 标签内的位

于 2009-11-02T13:10:03.427 回答
0
/<a[^>]*>([^<]*mylink[^<]*)<\/a>/

这有点简单,因为如果标签位于链接(<a href="/xyz">xyz <i>mylink</i> aaa</a>)内,它会中断,但它应该可以工作。

于 2009-11-02T13:10:41.030 回答