我创建了一个模式从3号匹配的字符串:a
标签之间(如333):PHP预浸反转
@((<a>(.?[^(<\/a>)].?))*)([0-9]{3})(((.*?)?</a>))@i
我怎样才能反转上面的图案a
标签之间得到的数字不是。
我尝试用?!
但不工作
编辑: 例输入数据:
lor <a>111</a> em 222 ip <a><link />333</a> sum 444 do <a>x555</a> lo <a>z 666</a> res
我创建了一个模式从3号匹配的字符串:a
标签之间(如333):PHP预浸反转
@((<a>(.?[^(<\/a>)].?))*)([0-9]{3})(((.*?)?</a>))@i
我怎样才能反转上面的图案a
标签之间得到的数字不是。
我尝试用?!
但不工作
编辑: 例输入数据:
lor <a>111</a> em 222 ip <a><link />333</a> sum 444 do <a>x555</a> lo <a>z 666</a> res
你正在试图解决在文本域中的HTML问题,这只是尴尬使用。正确的方法是使用DOM解析器;您可以使用XPath表达式过滤你想要什么:
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//text()[not(ancestor::a)]') as $node) {
if (preg_match('/\d{3}/', $node->textContent)) {
// do stuff with $node->textContent;
}
}
kicaj,这种情况听起来很相似,这个问题regex match a pattern unless...。
有关使用正则表达式来解析html的所有免责声明,有一个简单的方法来做到这一点。
这是我们简单的regex(见demo):
<a.*?</a>(*SKIP)(*F)|\d{3}
交替的左侧|
比赛完全<a ... </a>
标签然后故意失败,跳到字符串中的下一个位置。右侧匹配三个数字组,我们知道它们是正确的数字,因为它们没有与左侧表达式匹配。
请注意,如果您只想精确匹配三位数字,而不是三位数字, 123
在12345
,你可能要添加一个负前瞻和负回顾后:
<a.*?<\/a>(*SKIP)(*F)|(?<!\d)\d{3}(?!\d)
参考
How to match (or replace) a pattern except in situations s1, s2, s3...
'[^(<\/a>)]'并没有真正做什么你认为它的确如此。 –
也许正则表达式不适合这份工作。 – JJJ
@Jack:我尝试'[[(((。?[^(<\/a>)。?))*)])'但是不起作用 – kicaj