使用 PHP 将子字符串动态替换为子字符串


Dynamically Replace Substring With Substring Using PHP

我有一个文本主体存储为字符串。我想用该子字符串的子字符串替换多个子字符串。这是我想要替换的典型子字符串(请注意,我要替换多个子字符串)。

$String = "loads of text [[gibberish text|Text i Want]] more text  [[gibberish text|Text i Want]] more text [[if no separator then  just remove tags]]";
$String = deleteStringBetweenStrings("[[", "|", $String , true);

deleteStringBetweenString 是一个递归函数,它将删除 2 个子字符串(包括子字符串)之间的所有代码,这将为第一个子字符串做我想要的,但在此之后有点疯狂。

function deleteStringBetweenStrings($beginning, $end, $string, $recursive)
{
    $beginningPos = strpos($string, $beginning);
    $endPos = strpos($string, $end);
if ($beginningPos === false || $endPos === false) 
{
    return $string;
}
$textToDelete = substr($string, $beginningPos, ($endPos + strlen($end)) - $beginningPos);
$string = str_replace($textToDelete, '', $string);
if (strpos($string, $beginning) && strpos($string, $end) && $recursive == true) 
{
    $string = deleteStringBetweenStrings($beginning, $end, $string, $recursive);
}
return $string;
}

有没有更有效的方法让我做到这一点?

预期输出 ="文本加载 文本 我想要更多文本

文本 我想要更多文本 如果没有分隔符,则只需删除标签"

像这样的东西应该可以解决问题(同时保留添加自己的开始和结束字符串的能力):

function deleteStringBetweenStrings($start, $end, $string) {
    // create a pattern from the input and make it safe to use in a regular expression
    $pattern = '|' . preg_quote($start) . '(.*)' . preg_quote($end) . '|U';
    // replace every occurrence of this pattern with an empty string in full $string
    return preg_replace($pattern, '', $string);
}

$String = "loads of text [[gibberish text|Text i Want]] more text  [[gibberish text|Text i Want]] more text [[if no separator then  just remove tags]]";
$String = deleteStringBetweenStrings("[[", "|", $String);

正则表达式和正则表达式。

只需使用以下正则表达式来匹配您不需要的文本,然后将其替换为空字符串即可。

(?<='['[)(?:(?!']]|'|).)*'||'['[|']']

演示

法典:

<?php
$str = "loads of text [[gibberish text|Text i Want]] more text [[gibberish text|Text i Want]] more text [[if no separator then just remove tags]]";
echo preg_replace("/(?<='['[)(?:(?!']]|'|).)*'||'['[|']']/m", "", $str);
?>

输出:

loads of text Text i Want more text Text i Want more text if no separator then just remove tags

我是怎么想出来的?

  • (?<='['[) 照顾[[符号。
  • (?:(?!']]|'|).)* 匹配任何字符,但不匹配 ]]|符号零次或多次。
  • '| 文字|符号。这可确保匹配项在到达右括号之前必须包含|符号]]
  • 所以我之前解释的正则表达式只会在这种[[gibberish text|Text i Want]]类型的字符串中匹配gibberish text|,它不会触及这个[[if no separator then just remove tags]]
  • |
  • '['[ 现在匹配[[
  • |
  • ']']符号。删除所有匹配的字符将为您提供所需的输出。

试试这个:

$string = 'loads of text [[gibberish text|Text i Want]] more text  [[gibberish text|Text i Want]] more text [[if no separator then  just remove tags]]';
function doReplace($matches) {
    $str = $matches[2];
    if (strpos($str, '|')) {
        $parts = explode('|', $str);
        return $parts[1];
    } else {
        return $str;
    }
}
echo preg_replace_callback('/('['[(.*?)']'])/', 'doReplace', $string);

它呼应

loads of text Text i Want more text Text i Want more text if no separator then just remove tags

我认为这正是你想要的!