用于PHP prege_replace的正则表达式来查找标签之间的数字

时间:2016-06-15 16:30:46

标签: php regex preg-replace

我知道这是一个天真的问题,但正则表达式总是令我感到困惑。

我想替换字符串中的数字,如果它们位于标记之间,这里是括号。

$str = " Some text 11 have number 12 (11,12,13)";

$array = array( 1 => 'one', 2 => 'two', 11 => 'eleven', 12 => 'twelve', 13 => 'thirteen');

foreach ($array as $key => $value) {
$str = preg_replace( 'regex to match $key', $value, $str);
}

结果应为

$str = " Some text 11 have number 12 (eleven,twelve,thirteen)";

我正在努力与正则表达式模式匹配应该在括号内的数字。括号内只有数字和,

3 个答案:

答案 0 :(得分:4)

我建议使用一个正则表达式,它在开始(后找到用逗号分隔的所有连续数字(数字块)。然后,匹配可以传递给preg_replace_callback,如果数组中存在相应的键,则将其替换为相应的值,否则,只需将匹配放回去。

这是正则表达式:

(?:\G(?!\A)|\(),?\K\d+

请参阅regex demo

<强>详细信息:

  • (?:\G(?!\A)|\() - 匹配上一次成功匹配(\G(?!\A))或(符号
  • 的位置
  • ,? - 可选的(1或0)逗号
  • \K - 运营商放弃目前为止匹配的所有文字
  • \d+ - 一个或多个数字(我们在匹配中返回的唯一文字)。

这是PHP code

$re = '/(?:\G(?!\A)|\(),?\K\d+/'; 
$str = "Some text 11 have number 12 (9,11,12,13)"; 
$array = array( 11 => 'eleven', 12 => 'twelve', 13 => 'thirteen');

echo $result = preg_replace_callback($re, function ($m) use ($array) {
    return !empty($array[$m[0]]) ? $array[$m[0]] : $m[0];
}, $str) . PHP_EOL;

结果为Some text 11 have number 12 (9,eleven,twelve,thirteen) 9中缺少$array

答案 1 :(得分:2)

你可以试试这个:

$str = " Some text 11 have number 12 (11,12,13)";
$array = array( 11 => 'eleven', 12 => 'twelve', 13 => 'thirteen');

foreach ($array as $key => $value) {
    $str = preg_replace('/(\(|,)' . $key . '(\)|,)/', "$1" . $value . "$2", $str);
}

当你var_dump($str)时:

string(53) " Some text 11 have number 12 (eleven,twelve,thirteen)"

答案 2 :(得分:2)

我使用preg_replace_callback。然后,您可以使用\(([\d\h,]+)\)检查()内的数字,水平空格或逗号,并捕获所有找到的值。然后该函数使用str_replace替换它们。

$string = " Some text 11 have number 12 (11,12,13)";
$array = array( 11 => 'eleven', 12 => 'twelve', 13 => 'thirteen');
echo preg_replace_callback('/\(([\d\h,]+)\)/', function ($matches) use ($array) {
     return str_replace(array_keys($array), array_values($array), $matches[1]);
}, $string);

演示:https://eval.in/589888