2014-06-05 37 views
4

我创建了一个模式从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 
+5

'[^(<\/a>)]'并没有真正做什么你认为它的确如此。 –

+1

也许正则表达式不适合这份工作。 – JJJ

回答

5

你正在试图解决在文本域中的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; 
    } 
} 
0

kicaj,这种情况听起来很相似,这个问题regex match a pattern unless...

有关使用正则表达式来解析html的所有免责声明,有一个简单的方法来做到这一点。

这是我们简单的regex(见demo):

<a.*?</a>(*SKIP)(*F)|\d{3} 

交替的左侧|比赛完全<a ... </a>标签然后故意失败,跳到字符串中的下一个位置。右侧匹配三个数字组,我们知道它们是正确的数字,因为它们没有与左侧表达式匹配。

请注意,如果您只想精确匹配三位数字,而不是三位数字, 12312345,你可能要添加一个负前瞻和负回顾后:

<a.*?<\/a>(*SKIP)(*F)|(?<!\d)\d{3}(?!\d) 

参考

How to match (or replace) a pattern except in situations s1, s2, s3...