我的正则表达式中的错误是什么?

时间:2014-08-14 15:00:47

标签: php html regex

我希望匹配包含没有任何url的字符串的所有href属性,字符串是本地文件路径,所以我写了这个php代码:

preg_match_all('/href="[^(http|https):\/\/](.*?)"/is',$tidyHtml,$matches);

这会返回一个这样的数组:

Array
(
    [0] => tatic/css/custom.css
)

但是,当T看到html来源时,href属性为static/css/custom.css而不是static/css/custom.css

2 个答案:

答案 0 :(得分:3)

你必须摆脱方括号。它们表示要匹配的字符列表,而不是部分。

您还必须使用负向lookbehind而不是倒置字符类。看到这个带有这场比赛的正则表达式:

/(?<=href=")(?!https?:\/\/)(.*?)"/is

这是regex demo

  

如何将src属性添加到此正则表达式?

您只需使用OR语句:

/(?<=href="|src=")(?!https?:\/\/)(.*?)"/is

这是UPDATED regex demo

答案 1 :(得分:2)

要解决这个问题,你必须使用像这样的负面预测

/href="(?!https?:\/\/)(.*?)"/is

它基本上会在字符串中的任意位置检查包含href="的字符串,然后查看下一个字符是否为http,并带有可选s后跟:// 。 如果不是这种情况,它会向前移动迭代器并捕获所有内容,直到第一个双引号"

  

如何将src属性添加到此正则表达式? - Mokhtarabadi

使用or-operation检查hrefsrc

的出现情况,实际上非常简单
/(?:href|src)="(?!https?:\/\/)(.*?)"/is
然后

将检查hrefsrc属性的结果正则表达式,仅匹配URL中没有协议的引用。