如何从字符串中替换数字,以便它们匹配正确的数字而不是它们的子数字?

时间:2012-01-27 09:14:10

标签: php regex wordpress numbers

我是正则表达的初学者。所以面临以下问题。

我的代码如下。

$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的字符串。

所以我得到的麻木很好,但我的问题是更换。我希望它仅用精确的数字匹配替换。

2 个答案:

答案 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} /