为什么我的正则表达式(在PHP中)不起作用?

时间:2014-06-23 01:49:56

标签: php regex

$ data是一个HTML文本,其中包含许多锚文本(链接)

$regex = '/\b<a/i';
$data = '<a href="#">test</a> <a href="#">test 2</a>';
preg_match_all($regex, $data, $matches);

不返回任何内容,但$ data有两个<a

$regex = '/\b</i';

会返回很多&#39;&lt;&#39;像预期的那样

$regex = '/\ba/i';

返回很多&#39; a&#39;像预期的那样,但是

$regex = '/\b<a/i';

什么都不返回。

为什么?

3 个答案:

答案 0 :(得分:3)

除了不使用DOM parser之外,使用\b是问题所在,因为它基本上匹配了&#34;类似词语&#34;性格和某些不是,即

(?<=\W)(?=\w)|(?<=\w)(?=\W)

在这种情况下,只有<前面有一个字母才会\b匹配,例如:

foo<a

也许更好的表达方式是:

'/(?<=\s|>)<a/i'

或者,即便如此:

'/<a/i'

答案 1 :(得分:2)

如果您只想匹配<a ....

这应该足够了。 /<a/i

$data = "<a>Link 1</a> <a>Link 2</a> <a>Link 3</a>";
$regex =  '/<a/i'; //also will match <A in <A>Text</A>
preg_match_all($regex, $data, $matches);

var_dump($matches); //

/*
array (size=1)
  0 => 
    array (size=3)
      0 => string '<a' (length=2)
      1 => string '<a' (length=2)
      2 => string '<a' (length=2)

*/

答案 2 :(得分:0)

  

$ regex =&#39; / \ b&lt; a / i&#39 ;;没有回报。那是为什么?

\b被称为字边界。当一边是&#34;字符)(字母,数字或下划线),而另一边不是单词字符时,它匹配。

当您尝试匹配<a中的text <a...时,<左侧没有字边界:

    左边的
  • <(不是单词字符)
  • 在右边是一个空格(不是单词字符)。

<强>参考: