【问题标题】:preg_replace expression can't include stringpreg_replace 表达式不能包含字符串
【发布时间】:2020-04-18 13:30:22
【问题描述】:

在这里被逼上墙。我查看了其他有正则表达式负前瞻的帖子,但由于某种原因我无法让它工作。可能错过了一些非常简单的东西,但在尝试了几个小时后我需要帮助!

所以,我试图找到 preg_replace 的模式,它通过代码搜索 href 链接,该链接忽略任何包含特定域的内容,也忽略任何包含名为 data-fancybox 的 js 引用的内容。

在下文中,它必须忽略前 3 个包含 data-fancybox 的内容,同时也忽略 #4 youtube 链接。它应该只找到最后 2 个。

  1. <a href="https://youtube.com/" data-fancybox>
  2. <a href="https://example.com/" data-fancybox>
  3. <a href="https://vimeo.com/" data-fancybox>
  4. <a href="https://youtube.com/">
  5. <a href="https://example.com/">
  6. <a href="https://vimeo.com/">

当我尝试这个时:

<a href=.*((youtube|data-fancybox)).*>

它选择前 4 个并忽略后两个。但是当我试图把这个负面的,所以它只挑选出最后两个时,它最终把它们都挑选出来了:

<a href=.*(?!(youtube|data-fancybox)).*>

任何帮助表示赞赏!

【问题讨论】:

  • 为什么不呢? if (!preg_match($pattern,$string)):
  • 我不能使用'? if (!preg_match($pattern,$string)):' 因为 preg_match 需要遍历一大块 HTML 文本,其中包含各种 href 链接;它需要在返回 HTML 块之前选择某些链接并调整它们

标签: php regex preg-replace


【解决方案1】:

您应该在您感兴趣的文本出现之前指定所有字符,例如 youtube.com。检测不是 youtube.com 的链接

$pattern = '/(<a href=\"https:\/\/(?!youtube.com).*)/';
$string[] = '<a href="https://youtube.com/" data-fancybox>';
$string[] = '<a href="https://example.com/" data-fancybox>';
$string[] = '<a href="https://vimeo.com/" data-fancybox>';
$string[] = '<a href="https://youtube.com/">';
$string[] = '<a href="https://example.com/">';
$string[] = '<a href="https://vimeo.com/">';
foreach ($string as $key=>$str)
{
    if (preg_match($pattern, $str, $matches))
        echo "$key valid<BR>";
    else
        echo "$key not valid<BR>";
}

检测不是data-fancybox的链接

$pattern = '/(.*\" (?!data-fancybox)|.*\">)/';

【讨论】:

  • 这更近了一步;但这是否意味着不可能有一个同时否定“youtube”或“data-fancybox”的模式,因为我们无法指定出现在“data-fancybox”之前的字符串?
  • 当您编写类似 q(?!youtube.com) 的内容时,您要求的是 youtube.com 后面没有的 q 字符。据我所知,您始终需要指定此字符,在本例中为 q。您的模式的问题是您没有指定简单说的字符。* youtube.com 后面没有几个字符,这就是所有句子都有效的原因
  • 检测 data-fancibox 你可以试试 $pattern = '/.*\" (data-fancybox).*/';
  • 在没有 data-fancibox 的情况下检测:$pattern = '/(.*\" (?!data-fancybox)|.*\">)/';
  • 对两个结果进行 OR 运算:$pattern = '/)/';
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2012-05-11
  • 2016-04-21
  • 2011-06-27
  • 1970-01-01
  • 2014-06-21
  • 2014-03-23
相关资源
最近更新 更多