我有一个文本主体存储为字符串。我想用该子字符串的子字符串替换多个子字符串。这是我想要替换的典型子字符串(请注意,我要替换多个子字符串)。
$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
我认为这正是你想要的!