【发布时间】:2011-10-16 02:19:24
【问题描述】:
$string = "<tag>i dont know what is here</tag>"
$string = str_replace("???", "<tag></tag>", $string);
echo $string; // <tag></tag>
那么我在寻找什么代码?
【问题讨论】:
标签: php replace str-replace
$string = "<tag>i dont know what is here</tag>"
$string = str_replace("???", "<tag></tag>", $string);
echo $string; // <tag></tag>
那么我在寻找什么代码?
【问题讨论】:
标签: php replace str-replace
一个通用函数:
function replace_between($str, $needle_start, $needle_end, $replacement) {
$pos = strpos($str, $needle_start);
$start = $pos === false ? 0 : $pos + strlen($needle_start);
$pos = strpos($str, $needle_end, $start);
$end = $pos === false ? strlen($str) : $pos;
return substr_replace($str, $replacement, $start, $end - $start);
}
【讨论】:
$search = "/[^<tag>](.*)[^<\/tag>]/";
$replace = "your new inner text";
$string = "<tag>i dont know what is here</tag>";
echo preg_replace($search,$replace,$string);
输出:
<tag>your new inner text</tag>
【讨论】:
Warning: preg_replace() [function.preg-replace]: Unknown modifier 't' on line 1
$string = "<tag>I do not know what is here</tag>";
$new_text = 'I know now';
echo preg_replace('#(<tag.*?>).*?(</tag>)#', '$1'.$new_text.'$2' , $string); //<tag>I know now</tag>
【讨论】:
如果“标签”发生变化:
$string = "<tag>i dont know what is here</tag>";
$string = preg_replace('|^<([a-z]*).*|', '<$1></$1>', $string)
echo $string; // <tag></tag>
【讨论】:
$string = "<tag>i dont know what is here</tag>"
$string = "<tag></tag>";
echo $string; // <tag></tag>
还是只是?
$string = str_replace($string, "<tag></tag>", $string);
对不起,忍不住了。也许你用更多细节更新你的问题。 ;)
【讨论】:
如果您不知道 <tag> 标记内的内容,则可能还有另一个 <tag> 标记,例如
<tag>something<tag>something else</tag></tag>
所以一个通用的字符串替换函数将无法完成这项工作。
更强大的解决方案是将字符串视为 XML 并使用DOMDocument 对其进行操作。诚然,这仅在字符串作为 XML 有效时才有效,但我仍然认为它是比字符串替换更好的解决方案。
$string = "<tag>i don't know what is here</tag>";
$replacement = "replacement";
$doc = new DOMDocument();
$doc->loadXML($str1);
$node = $doc->getElementsByTagName('tag')->item(0);
$newNode = $doc->createElement("tag", $replacement);
$node->parentNode->replaceChild($newNode, $node);
echo $str1 = $doc->saveHTML($node); //output: <tag>replacement</tag>
【讨论】:
通用且非正则表达式的解决方案:
我修改了@felix-kling 的答案。现在它只在找到针时替换文本。
另外,我添加了更换针头、起始位置和更换所有火柴的参数。
我使用了mb_ 函数来使函数多字节安全。
如果您需要不区分大小写的解决方案,请将 mb_strpos 调用替换为 mb_stripos。
function replaceBetween($string, $needleStart, $needleEnd, $replacement,
$replaceNeedles = false, $startPos = 0, $replaceAll = false) {
$posStart = mb_strpos($string, $needleStart, $startPos);
if ($posStart === false) {
return $string;
}
$start = $posStart + ($replaceNeedles ? 0 : mb_strlen($needleStart));
$posEnd = mb_strpos($string, $needleEnd, $start);
if ($posEnd === false) {
return $string;
}
$length = $posEnd - $start + ($replaceNeedles ? mb_strlen($needleEnd) : 0);
$result = substr_replace($string, $replacement, $start, $length);
if ($replaceAll) {
$nextStartPos = $start + mb_strlen($replacement) + mb_strlen($needleEnd);
if ($nextStartPos >= mb_strlen($string)) {
return $result;
}
return replaceBetween($result, $needleStart, $needleEnd, $replacement, $replaceNeedles, $nextStartPos, true);
}
return $result;
}
$string = "{ Some} how it {is} here{";
echo replaceBetween($string, '{', '}', '(hey)', true, 0, true); // (hey) how it (hey) here{
【讨论】:
如果您也需要更换该部分,那么此功能很有帮助:
$var = "Nate";
$body = "Hey there {firstName} have you already completed your purchase?";
$newBody = replaceVariable($body,"{","}",$var);
echo $newBody;
function replaceVariable($body,$needleStart,$needleEnd,$replacement){
while(strpos($body,$needleStart){
$start = strpos($body,$needleStart);
$end = strpos($body,$needleEnd);
$body = substr_replace($body,$replacement,$start,$end-$start+1);
}
return $body;
}
我必须替换放入已提交的文本区域的变量。所以我用 Nate 替换了 firstName(包括花括号)。
【讨论】:
strpos($body,$needleEnd); 将从字符串的开头开始搜索。要从起始针开始搜索,您需要一个偏移量:strpos($body,$needleEnd, $needleStart);.