是否可以跳过strpos / strrpos位置?
$string = "This is a cookie 'cookie'.";
$finder = "cookie";
$replacement = "monster";
if (strrpos($string, $finder) !== false)
str_replace($finder, $replacement, $string);
我想跳过' cookie'并更换普通饼干,这样就会导致"这是一个怪物' cookie'。"
我没有对它发现' cookie'首先然后检查它(显然有必要确定它不应该被替换),但我想确保在“' cookie'仍然存在,我可以使用相同的功能来查找未加引号的cookie。
或者,是否有一个函数我还没有找到(通过几小时的搜索)来获取特定单词的所有索引,所以我可以通过循环检查它们而不使用正则表达式?
重要的是它是索引,而不是单词本身,因为还有其他检查需要根据单词的位置在字符串中的位置进行。
答案 0 :(得分:2)
您可以尝试使用正则表达式:
尝试以下方法:
$string = "This is a cookie 'cookie'.";
var_dump(preg_replace("/(?<!')(cookie)/", ' monster', $string));
这使用preg_replace
代替str_replace
来替换字符串。
修改:您可以使用preg_match
获取匹配的正则表达式在字符串中的位置,如:
$string = "This is a cookie 'cookie'.";
$finder = "cookie";
preg_match("/(?<!')(" . preg_quote($finder) . ")/", $string, $matches, PREG_OFFSET_CAPTURE);
var_dump($matches);
您可以使用preg_quote
确保preg_match
和preg_replace
不将$finder
var视为regex
。并且preg
和php中的其他字符串函数之间的性能差异非常微妙。您可以运行一些基准测试,看看它的情况会有所不同。
答案 1 :(得分:1)
以下给出了所需的替换以及替换单词的位置。
$string = "This is a cookie 'cookie'.";
$finder = "cookie";
$replacement = "monster";
$p = -1; // helps get position of current word
$position = -1; // the position of the word replaced
$arr = explode(' ',$string);
for($i = 0; $i < count($arr); $i += 1){
// Find the position $p of each word and
// Catch $position when a replacement is made
if($i == 0){$p = 0;} else { $w =$arr[$i - 1]; $p += strlen($w) + 1;}
if($arr[$i] == $finder){ if($position < 0){$position = $p;}$arr[$i] = $replacement;}}
$newstring = implode(' ', $arr);
echo $newstring; // gives: This is a monster 'cookie'
echo '<br/>';
echo $position; // gives 10, the position of replaced element.
对于该位置,假设该句子只有单个空格,因为在explode
和implode
函数中使用了空格。否则,需要修改双重或更大空间的情况,可能需要用@$#
作为explode
和{{1}的第一个参数的唯一字符或字符集替换空格。函数。
可以修改代码以捕获多个替换,例如通过捕获数组中的每个替换位置而不是测试implode
。这还需要更改if(position < 0)
的计算方式,因为它的值会受到先前替换长度的影响。
答案 2 :(得分:1)
我们也可以这样做,为了简短:
还包括函数str_replace的前一个字母,如下所示:
$string = "This is a cookie 'cookie'.";
echo str_replace('a cookie','a monster',$string);