【问题标题】:Dynamically Replace Substring With Substring Using PHP使用 PHP 用子字符串动态替换子字符串
【发布时间】:2014-11-19 10:21:29
【问题描述】:

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

$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);

deleteStringBetweenStrings 是一个递归函数,它将删除 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;
}

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

预期输出=“文本负载文本我想要更多文本文本我想要更多文本如果没有分隔符那么只需删除标签”

【问题讨论】:

  • 你的预期输出是什么?
  • "大量文本文本我想要更多文本文本我想要更多文本如果没有分隔符那么只需删除标签"

标签: php regex string


【解决方案1】:

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

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);

【讨论】:

  • 所有解决方案都有效,但您对函数所做的更改让我现在的生活变得如此轻松。这不仅解决了这个问题,而且还解决了许多其他问题,即从字符串中删除内容。我希望我能理解这一点,但它的工作原理让我很高兴!谢谢你:D
  • @DanHastings 我在代码中添加了一些注释,这可能会帮助您更好地理解它。当您在 Google 上搜索 php preg_replace example 时,您可能会更好地理解它;)
【解决方案2】:

仅正则表达式和正则表达式......

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

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

DEMO

代码:

<?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

我是怎么弄出来的?

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

【讨论】:

  • 不适用于 tilda。从演示返回的以下代码有效 '/(?
  • 好的,我改变了分隔符。
【解决方案3】:

试试这个:

$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

我认为这正是您想要的!

【讨论】:

  • if no separator then just remove tags 呢?
猜你喜欢
  • 2019-04-19
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 2016-12-24
  • 2012-08-09
  • 2014-10-12
  • 2017-12-06
  • 2016-09-17
相关资源
最近更新 更多