【问题标题】:PHP replace patterns in string with URLsPHP 用 URL 替换字符串中的模式
【发布时间】:2021-12-30 17:29:24
【问题描述】:

我有几百个 html 文件要在网站上显示。 它们都有以下格式的链接:

[My Test URL|https://www.mywebsite.com/test?param=123]

问题是一些 url 被分割成这样:

[My Test URL|https://www.mywebsite.c om/test?param=123]

我想用 HTML 对应部分替换所有这些:

<a href="https://www.mywebsite.com/test?param=123">My Test URL</a>

我知道使用正则表达式 "/[(.*?)]/" 我可以匹配括号,但是如何通过管道拆分、删除 URL 中的空格并将所有内容转换为字符串?

【问题讨论】:

  • 如果你想匹配两个部分,那么添加两个捕获组(也转义[])然后只是循环输出链接3v4l.org/2Jaid的一个例子
  • 感谢您的帮助,它适用于给定的正则表达式。但是我怎样才能将它替换为文本本身呢?我不能只回显链接,但我需要替换所有内容。
  • 非常感谢:) 但是我又遇到了无法替换的 URL 中的空格问题。有没有办法解决这个问题?
  • 哦,大声笑没有看到空格.. 您可以使用 preg_replace_callback 调用函数在替换 3v4l.org/5PbGD 之前对匹配项执行操作 - 尽管 https://www.mywebsite.c om/test?param=123 不是有效的域名,所以应该解决导致它有空格的问题,如果它是硬编码的,你可以在你的编辑器mywebsite.c om->mywebsite.com中找到所有和字符串替换,不需要代码

标签: php regex url square-bracket


【解决方案1】:

如果您只想删除这些降价链接中 URL 部分中的(空白)空格,您可以仅使用 preg_replace 之类的

preg_replace('~(?:\G(?!\A)|\[[^][|]*\|)[^][\s]*\K\s+(?=[^][]*])~', '', $text)

请参阅regex demo详情

  • (?:\G(?!\A)|\[[^][|]*\|) - 上一场比赛结束或[,然后是除[]| 之外的零个或多个字符,然后是| 字符
  • [^][\s]* - 除了[] 和空格之外的零个或多个字符
  • \K - 丢弃目前匹配的所有文本
  • \s+ - 一个或多个空格
  • (?=[^][]*]) - 除了[] 之外,必须有零个或多个字符,然后在当前位置的右侧紧邻]

如果你想去掉 URL 部分的空格并将 markdown 转换为 HTML,你最好使用preg_replace_callback:

$text = '[My Test URL|https://ww w.mywebsite.c om/t  est?param=123]';

echo preg_replace_callback('/\[([^][|]*)\|([^][]+)]/', function($m) {
    return '<a href="' . str_replace(' ', '', $m[2]) . '">' . $m[1] . '</a>';
}, $text);

请参阅PHP demo详情

  • \[ - 一个 [ 字符
  • ([^][|]*) - 第 1 组:除 []| 之外的任何零个或多个字符
  • \| - 一个 | 字符
  • ([^][]+) - 第 2 组:除 ][ 之外的任何一个或多个字符
  • ] - ] 字符。

【讨论】:

    【解决方案2】:

    如果您想从php 中的字符串中删除所有WHITESPACES,您只需:

    $string = str_replace(' ', '', $string);

    其中$string 是您的字符串,带有url

    【讨论】:

      【解决方案3】:

      我想这对你有用

      $html = "[My Test URL|https://www.mywebsite.c om/test?param=123] [My Test URL|https://www.mywebsite.com/test?param=123]";
      $html = preg_replace_callback("|\[.*?\|.*?\]|", function($matches){
          list($anchor, $link) = explode("|",substr($matches[0], 1, -1));
          return "<a href='".str_replace(' ', '', $link)."'>$anchor</a>";
      }, $html);
      
      echo $html;
      // echos  <a href="https://www.mywebsite.com/test?param=123">My Test URL</a> <a href="https://www.mywebsite.com/test?param=123">My Test URL</a>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-05
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多