我正在尝试匹配html标记的内容/文本中的单词contact
。我可以在标签之间获取所有文字:
http://rubular.com/r/IkhG2nhmnS
使用:
(?<=\"\>)(.*?)(?=\<\/)
但我想只搜索contact
这个词,它不起作用:
http://rubular.com/r/We44nHisLf
使用:
(?<=\"\>)(contact*?)(?=\<\/)
任何人都可以指导我如何在html标签的文本/内容中匹配我想要的单词。在上述情况下,我想查找/匹配单词contact
感谢您的帮助
答案 0 :(得分:3)
此正则表达式将拉出锚标记中href内的所有文本。
<a\b[^>]*?\bhref=(['"])([^'"]*)\1[^>]*?>
组0将包含从<a
到>
\1
以匹配关闭引用使用正则表达式可能不是解析HTML的好主意,因为有许多边缘情况会使正则表达式绊倒。
<?php
$sourcestring="your source string";
preg_match_all('/<a\b[^>]*?\bhref=([\'"])([^\'"]*)\1[^>]*?>/im',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
$matches Array:
(
[0] => Array
(
[0] => <a href="contact">
)
[1] => Array
(
[0] => "
)
[2] => Array
(
[0] => contact
)
)
<a
匹配<a
\b
单词char(\ w)和。之间的边界
不是单词char的东西[^>]*?
任何字符,除了:'&gt;' (0次或更多次
(匹配尽可能少的数量))\b
单词char(\ w)和。之间的边界
不是单词char的东西href=
匹配href=
(
分组并捕获到\ 1:['"]
任何字符:''',''')
结束\ 1 (
分组并捕获到\ 2:[^'"]*
任何字符,除了:''','''(0或
更多次(匹配最多的金额
可能的)))
结束\ 2 \1
与capture \ 1 [^>]*?
任何字符,除了:'&gt;' (0次或更多次
(匹配尽可能少的数量))>
匹配>
)
分组结束答案 1 :(得分:2)
您可能需要this之类的内容:
(?<=\"\>).*(contact)?(?=\<\/)
您当前的正则表达式:
(?<=\"\>)(contact*?)(?=\<\/)
只会匹配:
<a href="contact">contact</a>
但也......
<a href="contact">contactttt</a>
甚至......
<a href="contact">contac</a>
由于*
仅适用于其前面的t
。
我的正则表达式中的.*
允许contact
之前的任何字符。
答案 2 :(得分:2)
确保在匹配文本之前不会遇到另一个标记的最安全方法是:
(?<=\"\>)[^<]*(contact)
,其中
[^<]*
表示:(一个不是&lt;的字符),尽可能多次
答案 3 :(得分:1)
如果您真的必须使用正则表达式来解析HTML标记,那么
(?<=>)[^<]*(contact)[^<]*(?=<\/)
这是a test。您的比赛是在第1组。
但是,请查看DOM functions,以便正确解析结构化文档。