1

我使用preg_replace必须从 中清除所有reltarget属性$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都必须具有定义rel和属性。target

4

3 回答 3

1

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

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

我在 REGEX 方面不是最好的,但据我所知,这会为您节省一些时间。

于 2012-09-13T08:08:17.737 回答
0

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

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

'/href=["\']?([^"\'>]+)["\']?/'

于 2013-08-02T14:58:41.483 回答
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);

干杯。

于 2012-09-13T07:55:24.557 回答