PHP preg_replace 的正则表达式以查找标签之间的数字
Regex for PHP preg_replace to find numbers between tags
我知道这是个幼稚的问题,但正则表达式总是让我感到困惑。
我想替换字符串中位于标记之间的数字,这里是括号。
$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)";
我正在努力使用正则表达式模式来匹配应该在括号内的数字。括号内只有数字和 ,
.
你可以试试这个:
$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 . '(\)|,)/', "" . $value . "", $str);
}
当你 var_dump($str)
:
string(53) " Some text 11 have number 12 (eleven,twelve,thirteen)"
我会使用 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);
我建议使用正则表达式来查找所有连续的数字(数字块)在开头 (
后用逗号分隔。然后,可以将匹配项传递给 preg_replace_callback
,如果数组中存在相应的键,则将其替换为相应的值,否则,只需将匹配项放回原处即可。
这是正则表达式:
(?:\G(?!\A)|\(),?\K\d+
详情:
(?:\G(?!\A)|\()
- 匹配上一个成功匹配的位置 (\G(?!\A)
) 或 (
符号
,?
- 可选(1 或 0)逗号
\K
- 运算符丢弃到目前为止匹配的所有文本
\d+
- 1 个或多个数字(我们在匹配中返回的唯一文本)。
这里是 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)
,因为 $array
中缺少 9
。
我知道这是个幼稚的问题,但正则表达式总是让我感到困惑。
我想替换字符串中位于标记之间的数字,这里是括号。
$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)";
我正在努力使用正则表达式模式来匹配应该在括号内的数字。括号内只有数字和 ,
.
你可以试试这个:
$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 . '(\)|,)/', "" . $value . "", $str);
}
当你 var_dump($str)
:
string(53) " Some text 11 have number 12 (eleven,twelve,thirteen)"
我会使用 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);
我建议使用正则表达式来查找所有连续的数字(数字块)在开头 (
后用逗号分隔。然后,可以将匹配项传递给 preg_replace_callback
,如果数组中存在相应的键,则将其替换为相应的值,否则,只需将匹配项放回原处即可。
这是正则表达式:
(?:\G(?!\A)|\(),?\K\d+
详情:
(?:\G(?!\A)|\()
- 匹配上一个成功匹配的位置 (\G(?!\A)
) 或(
符号,?
- 可选(1 或 0)逗号\K
- 运算符丢弃到目前为止匹配的所有文本\d+
- 1 个或多个数字(我们在匹配中返回的唯一文本)。
这里是 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)
,因为 $array
中缺少 9
。