Regex用于匹配单引号、双引号和无引号


Regex for matching single,double an no quotes

我使用preg_replace函数,该函数必须从$body中清除所有reltarget属性,并用其他值替换它们。这是:

    $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属性,无论用户输入了什么。

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

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

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

它很可能与它们匹配,但由于<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);

干杯。

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

  1. 无引号
  2. 双引号
  3. 单引号

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