Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何替换字符串中的数字,使它们只匹配正确的数字而不匹配其子数字?_Php_Regex_Wordpress_Numbers - Fatal编程技术网

Php 如何替换字符串中的数字,使它们只匹配正确的数字而不匹配其子数字?

Php 如何替换字符串中的数字,使它们只匹配正确的数字而不匹配其子数字?,php,regex,wordpress,numbers,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++) { $getN

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

我的代码如下

$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;
$originalStr=“101 abc 1101 xyz”;
preg_match_all('/[0-9]{3,5}/',$originalStr,$matches);
$result=array();
$result=array_unique($matches[0]);
排序($result);
全球$wpdb;
对于($i=0;$iget_结果($getName);
$replacetwith=“”;
foreach($obj数据)
{
$replaceWith=$obj->Name;
$originalStr=str_replace($result[$i],$result[$i]。“:”$replaceWith,$originalStr);
打破
}   
}
echo$originalStr;
在这里,我的目的是用“product id:product Name”替换product id,但问题是,由于1101的子编号是101,所以它将1101的字符串替换为101的字符串

因此,我得到的numbers数组很好,但我的问题是替换。我希望它只被替换为精确的numbermatch。

您可以使用,而不是手动循环结果列表,并在第二步替换它(str_replace不知道上下文或替换哪个)


所以只需在回调中执行数据库查询。在一个循环中执行多个查询或在该回调中执行多个查询都不是超高效的。但至少更简单。而且
preg\u replace\u回调
确切地知道它匹配的部分,并用返回的替换替换替换这个精确的子字符串。

可能会将您的regexp更改为类似于是
/(^ |\s)[0-9]{3,5}/

 $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
 }