正则表达式匹配单,双没有报价

时间:2012-09-13 07:51:47

标签: php regex preg-replace

我使用preg_replace函数清除rel中的所有target$body属性,并将其替换为其他值。这是:

    $patterns = array();
    $patterns[] = '/<a(.*) rel="([^"]*)"(.*)>/';
    $patterns[] = '/<a(.*) target="([^"]*)"(.*)>/';
    $patterns[] = '/<a(.*)>/';

    $replacements = array();
    $replacements[] = '<a$1$3>';
    $replacements[] = '<a$1$3>';
    $replacements[] = '<a rel="nofollow" target="_blank"$1>';

    $body = preg_replace($patterns,$replacements,$body);

问题在于它与单引号和无引号不匹配。 此外,如果有更好的方法可以清除链接中的reltarget属性并将其设置为其他属性,请提供建议。

由于

编辑:$body

    $body = '<a href="TEST">Link1</a>
      <a href="TEST" rel=\'lqlqlq\'>Link2</a>
      <a href="TEST" target="_blank" rel="lqlqlq">Link3</a>
              <a href="TEST" target=_blank rel=lqlqlq>Link4</a>';

由于文本的原因,工作链接的所有其他选项都是用户定义的,可能有些用户会作弊。我的目标 - $body中的所有链接都与定义的reltarget属性无关,无论用户输入了什么。

3 个答案:

答案 0 :(得分:1)

如果您不想同时匹配任何其他内容,我建议您不要同时保留系统资源。

$patterns[] = "/rel=[\"\']?([\w]+)[\"\']?/";
$patterns[] = "/target=[\"\']?([_a-zA-Z]+)[\"\']?/"

我不是最好的REGEX,但就我所知,这会为你节省一些时间。

答案 1 :(得分:0)

最有可能与它们相匹配,但由于<a(.*)>总是匹配,无论前两个是什么,你都不会从前两个模式得到任何结果。

这可以做你想要的:

$patterns = array();
$patterns[] = '/<a(.*) rel=[\'"]?\S+[\'"]? (.*)>/';
$patterns[] = '/<a(.*) target=[\'"]?\S+[\'"]? (.*)>/';

$replacements = array();
$replacements[] = '<a$1$3>';
$replacements[] = '<a$1$3>';

$body = preg_replace($patterns,$replacements,$body);

干杯。

答案 2 :(得分:0)

这个表达式将处理3个选项:

  1. 没有引号
  2. 双引号
  3. 单引号
  4.   

    &#39; / HREF = [&#34; \&#39;]?([^&#34; \&#39;&GT;] +)[&#34; \&#39;] ?/&#39;