我是正则表达的初学者。所以面临以下问题。
我的代码如下。
$originalStr="101 abc 1101 xyz";
preg_match_all('/[0-9]{3,5} /', $originalStr, $matches);
$result=array();
$result=array_unique($matches[0]);
sort($result);
global $wpdb;
for($i=0;$i<count($result);$i++)
{
$getName="SELECT Name FROM MyTable WHERE ProductID='".trim($result[$i])."' LIMIT 1";
$data = $wpdb->get_results($getName);
$replaceWith="";
foreach ($data as $obj)
{
$replaceWith=$obj->Name;
$originalStr=str_replace($result[$i], $result[$i]." : ".$replaceWith, $originalStr);
break;
}
}
echo $originalStr;
这里我的目的是用'产品ID:产品名称'替换产品ID,但问题是因为1101有101作为其子编号,所以它用101的字符串替换它1101的字符串。
所以我得到的麻木很好,但我的问题是更换。我希望它仅用精确的数字匹配替换。
答案 0 :(得分:2)
您可以使用preg_replace_callback
而不是手动循环结果列表并在第二步中替换它(str_replace不知道上下文或要替换哪一个)。
$newStr = preg_replace_callback('/([0-9]{3,5}) /', "cb_repl", $originalStr);
function cb_repl($match) {
list ($all, $num) = $match;
db("SELECT Name FROM MyTable WHERE ProductID='$num' LIMIT 1");
...
return "{$num} : {$replaceWith} "; // just the replacement string
}
所以只需在回调中进行数据库查询。在循环中进行多个查询,在回调中也不是非常有效。但它至少更容易。 preg_replace_callback
确切地知道它匹配的部分,并用返回的替换替换这个确切的子字符串。
答案 1 :(得分:0)
可能会将您的正则表达式更改为此类/(^|\s)[0-9]{3,5} /