php - 在选择首先替换字符串部分的顺序时替换字符串

标签 php arrays regex string replace

我正在尝试用某些单词替换一个字符串,但我也想按照数组中的位置顺序替换它。例如,我想在尝试替换“a b”之前替换“b c”,而不改变原始字符串中的位置。顺便说一句,这些字母应该代表实际的单词,它们不应该是另一个单词的一部分。例如,“太阳”一词是“向日葵”的一部分,不能因为其中有“太阳”一词就替换“向日葵”一词。

$text = "a b c";
$replacement = array("a b" => "ab","b c" => "bc");
$search = array_map(function($v){
    return preg_quote($v, "/");
}, array_keys($replacement));

echo $text = preg_replace_callback("/\b(" . implode("|", $search) . ")\b/", function($m)use($replacement){
    return $replacement[$m[1]];
}, $text);

第一个结果

ab c 

第二个结果

我调换了数组中的位置,认为这会影响字符串被替换的顺序。遗憾的是,它不是那样工作的,我得到了相同的结果。

$replacement = array("b c" => "bc","a b" => "ab");
ab c

在这一点上,我意识到影响字符串的哪一部分首先被替换的不是数组的位置,而是显示在原始字符串上的字符串部分的顺序决定了顺序其中它被替换为。

所以,我的问题是,有没有办法让它可以根据字符串在数组中的顺序或以不同的方式按顺序替换字符串?比如我要替换

"b c"

在我尝试替换“a b”而不改变原始字符串的位置之前。那可行吗?谢谢。

最佳答案

[编辑]

这个想法包括将原始文本转换为一个数组(开头有一个元素,即文本)。偶数索引处的数组项针对每个模式进行拆分。由于使用了 PREG_SPLIT_DELIM_CAPTURE 选项,定界符的索引始终为奇数,并且在匹配后保持不变。

$text = 'a b c';
$rep = ['b c'=>'bc', 'a b'=>'ab', ];

$pats = array_map(function($i) {
    return '~\b(' . preg_quote($i, '~') . ')\b~';
}, array_keys($rep));

$parts = (array)$text; // or $parts = [ $text ]; // it's the same

foreach ($pats as $pat) {
    $temp = [];
    foreach ($parts as $k=>$part) {
        if ($k & 1)
            $temp[] = $part;
        else
            $temp = array_merge(
                $temp,
                preg_split($pat, $part, -1, PREG_SPLIT_DELIM_CAPTURE)
            );
    }
    $parts = $temp;
}

$result = '';
foreach ($parts as $k=>$part) {
    $result .= ($k & 1) ? $rep[$part] : $part;
}

echo $result;

关于php - 在选择首先替换字符串部分的顺序时替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32405630/

相关文章:

javascript - 将 XML 文件加载到 JavaScript 数组中

java - 获取数组的索引

php - Mysql 获取数组查询?

ruby - 正则表达式匹配直到单词包含在数组中

php - 需要模型数据库类 (PHP/MySQL)

php - 如何保护我的 html+PHP 表单以防止用户黑客攻击/更改

php - [PHP/MySQL] : Prepared Statement in a loop

php - 你有什么建议用php设置共享服务器

regex - sed 无法识别括号后的制表符

正则表达式:匹配除特定模式之外的所有内容