正则表达式单引号问题

我写了一个正则表达式,目的是匹配a,img标签dom以及其里的href及src后的路径。

$pattern = '/<[a|img]{1}[^\>]*[href|src]{1}[\s=\"]+([\:\w\.\/]+)[\"\s]+[\/]?>[\x4e00-\x9fa5a-zA-Z_.]*<?\/?[a|img]?>?/i';

上面表达式可以匹配 <a href="http://www.zhai14.com" >,但我还想匹配其中超链接<a href='http://www.zhai14.com' >为单引的情况。
可是上面php字符串外面已经是单引,[\"\s]写成[\"\'\s]就会导致正则表达式失效,求解决方案。
另外, 上面自己写的正则好长,有没更简洁的方式呢。

附上测试正则的网站:http://regexr.com/

阅读 7.5k
3 个回答

我的问题提错了。我的写法并不会导致失效,是我输单引时,编辑器自动生成一对单引而导致出错。

附上我的测试代码(正则表达式稍微修改了下):

$subject = '<a class="goods" href=\'http://www.zhai14.com/blog/yuyou-story\'>我们的故事</a><span>真的不错</span></br><p>测试这行本来就这样</p>
<img src="http://wx4.sinaimg.cn/thumbnail/9671d518gy1fj8cojv6pvj20ku112n5w.jpg" />';
$pattern = '/<[a|img]{1}[^\>]*[href|src]{1}[\s=\"\']+([\:\w\-\.\/]+)[\"\s\']+[\/]?>[\x80-\xffa-zA-Z_.]*<?\/?[a|img]?>?/i';
preg_replace_callback($pattern, function($matches){
    var_dump($matches);
}, $subject);

换成以下代码即可

/<[a|img]{1}[^\>]*[href|src]{1}[\s=(\"|\')]+([\:\w\.\/]+)[(\"|\')\s]+[\/]?>[\x4e00-\x9fa5a-zA-Z_.]*<?\/?[a|img]?>?/i

在正则中使用 | 表示或,因而替换了2个地方.

第一个是 [\s=\"] -> [\s=(\"|\')]

第二个是 [\"\s] -> [(\"|\')\s]

新手上路,请多包涵
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题