PHP正则表达式加引号


PHP regex with quotes

我想匹配页面内容中的所有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[ ]*=[ ]*(?:'"|')(.+?)(?:'"|')/";