【问题标题】:Replacing multiple href values using a regular expression in PHP在 PHP 中使用正则表达式替换多个 href 值
【发布时间】:2016-11-04 16:45:05
【问题描述】:

我知道这个问题有更多的 WordPress 背景,但我希望只是我缺乏 PHP 知识是这里的问题。

我有一个查找<a> 标签的正则表达式,例如:<a href="http://website.co.uk/post/post-title">Find Out More</a>,这些标签是从用户输入的内容生成的。一旦找到此内容,foreach 循环就会在匹配的文本上运行,并使用 WordPress 函数 $postId = url_to_postid( $url ); 将 URL 转换为 PostID。

这是一个示例输出:<a href="#171">Find Out More</a>

只要在每段匹配的文本中有一个链接,就可以正常工作。但是,如果有两个或多个链接,它会将每个链接设置为具有相同的href,这是不正确的。

我确定这与我的循环运行方式有关。我正在使用的代码如下:

<?php
$string = get_field('sample_text_box');
$pattern = "/(?<=href=(\"|'))[^\"']+(?=(\"|'))/";
preg_match_all($pattern, $string, $matches);
$urls = $matches[0];

foreach($urls as $key => $url) {
$postId[$key] = url_to_postid( $url );
}

$newstring = preg_replace($pattern , $postId[$key] , $string);
echo $newstring;
?>

get_field('sample_text_box'); 行是一个高级自定义字段函数,它“返回指定字段的值”。如果有帮助,你可以在这里阅读:https://www.advancedcustomfields.com/resources/get_field/

谢谢!

【问题讨论】:

  • 您是否期望在此代码块末尾有多个 $newstring
  • 没有 quintessential answer 就不能有 HTML 正则表达式问题
  • @EatPeanutButter 基本上我的目标是更新已添加链接的每个href 值。我不确定您是否可以通过拥有多个$newstring 来实现这一目标更新完所有 href 后,将合并到一个文本块中。

标签: php arrays regex wordpress foreach


【解决方案1】:

您的代码的问题在于您确实将模式替换为单个值$postId[$key],其中$keyforeach 中分配的最后一个值。

您也不能传递 $postId,因为 preg_replace 期望模式和替换都是相同的类型 - 无论是字符串还是数组。

但是,使用preg_replace_callback 函数可以轻松解决问题:

$pattern = '/(?<=href\="|\')([^"\']+)(?="|\')/m';

$new_string = preg_replace_callback($pattern, function ($matches) {
  return isset($matches[1]) ? url_to_postid($matches[1]) : $matches[0];
}, $string);

【讨论】:

  • 感谢鲁斯兰!我试过粘贴它,但是当我运行它时,没有返回任何文本。我假设我用你的替换了我的$pattern = .....。但是我将$new_string ... 放在哪里?谢谢!
  • 完美,立即生效。感谢您提供该链接!非常感谢!
  • 对不起,我是个菜鸟,但是我如何在返回的 URL 前面附加一个“#”符号?即&lt;a href="#171"&gt;&lt;/a&gt; 每次我尝试'#' . 时,它都会将它附加到$string 前面。
  • 没错,谢谢!这是我没有尝试过的一个地方,我很抱歉!
猜你喜欢
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 2014-03-29
  • 2016-12-12
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多