$ 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';
什么都不返回。
为什么?
答案 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...
时,<
左侧没有字边界:
<
(不是单词字符)<强>参考:强>