我想匹配页面内容中的所有href值。我为此编写了regex并在regex101上进行了测试
href[ ]*=[ ]*("|')(.+?)'1
这找到我所有的href值正确。如果我使用
href[ ]*=[ ]*(?:"|')(.+?)(?:"|')
更好,因为我以后不必使用某些组。
在正则表达式字符串中使用" and "时,我无法使用
正常运行正则表达式$matches = array();
$pattern = "/href[ ]*=[ ]*("|')(.+?)'1/"; // syntax error
$numOfMatches = preg_match_all($pattern, $pattern, $matches);
print_r($matches);
如果我"转义"双引号,从而修复语法错误,我没有得到匹配。
所以-什么是正确的方式来应用给定的正则表达式在PHP?
谢谢你的帮助
指出:
- addslashes或preg_quote不会有帮助,因为我需要先传递合法字符串
- 转义所有特殊字符
' + * ? [ ^ ] $ ( ) { } = ! < > | : -
也没有帮助
EDIT:好吧,我知道我真的不应该用regex这样做。你能提供一些有用的DOM解析器或任何其他工具,我"应该"使用PHP为例?
对于您的情况,以下应该可以工作:
/<a's[^>]*href=('"??)([^'" >]*?)''1[^>]*>(.*)<'/a>/siU
考虑到WWW的性质,总是会有正则表达式失效的情况。对模式稍加修改就可以解决这些问题。
在href:
后面加空格/<a's[^>]*href's*='s*('"??)([^'" >]*?)''1[^>]*>(.*)<'/a>/siU
只匹配以http:
开头的链接/<a's[^>]*href=('"??)(http[^'" >]*?)''1[^>]*>(.*)<'/a>/siU
链接地址周围的单引号:
/<a's[^>]*href=(['"'']??)([^'" >]*?)''1[^>]*>(.*)<'/a>/siU
源我必须使用这个正则表达式才能使它工作。下次我一定会尝试使用DOM解析器:)
$regexForHREF = "/href[ ]*=[ ]*(?:'"|')(.+?)(?:'"|')/";