目前,我有以下代码,用于执行模式匹配&模式替换。
<?php
function fun($text) {
if (preg_match("/^(ATE|EAT)\s+(\S+).*/", $text)) {
$text = preg_replace("/^(ATE|EAT)\s+(\S+).*/", "EAT $2", $text);
} else {
$text = preg_replace("/.*(ATE|EAT).*/", "EAT", $text);
}
return $text;
}
// EAT pizza
echo fun('EAT pizza') . "\n";
// EAT pizza
echo fun('EAT pizza at paris') . "\n";
// EAT
echo fun('I EAT pizza at paris') . "\n";
我觉得上面的代码没有优化,因为我在preg_match
之前正在执行preg_replace
。我觉得这是多余的。
我尝试检查preg_replace
<?php
function fun($text) {
$tmp = preg_replace("/^(ATE|EAT)\s+(\S+).*/", "EAT $2", $text);
// I don't think this is the correct way to check for "Not Match" ?!
if ($tmp === $text) {
$tmp = preg_replace("/.*(ATE|EAT).*/", "EAT", $text);
}
return $tmp;
}
// EAT pizza
echo fun('EAT pizza') . "\n";
// EAT pizza
echo fun('EAT pizza at paris') . "\n";
// EAT
echo fun('I EAT pizza at paris') . "\n";
但是,fun('EAT pizza')
会失败,因为它会打印出EAT
而不是预期的EAT pizza
。
是否有正确的方法来优化上述代码?
答案 0 :(得分:3)
我认为你实际要求的是知道如何知道你的preg_replace中是否有任何替换,因为你不清楚你真正想要实现的目标。
来自preg-replace
上的PHP文档:
<强>描述强>
混合preg_replace(混合$ pattern,混合$替换,混合$ subject [,int $ limit = -1 [,int&amp; $ count]])
[..]
<强>计数强>
如果指定,则此变量将填充已完成的替换次数。
因此,如果您向preg_replace添加 count ,您将获得替换次数,从而获得出现次数。
给出的例子(由于缺乏信息,这是一种蓝色):
function fun($text) {
$count = 0;
$tmp = preg_replace("/^(ATE|EAT)\s+(\S+).*/", "EAT $2", $text, -1, $count);
if ($count == 0) {
$tmp = preg_replace("/.*(ATE|EAT).*/", "EAT", $text);
}
return $tmp;
}
因此,这会将ATE <something>
或EAT <something>
替换为EAT <something>
,或者,如果找不到,则会尝试替换ATE
或EAT
与EAT
。
答案 1 :(得分:0)
尝试使用以下功能:
function fun($text) {
$tmp = str_replace('ATE', 'EAT', $text);
$pos = strpos($text, 'EAT');
if ($pos < 0) {
return $text;
} else if ($pos > 0) {
$tmp = preg_replace('/^.*?EAT/', 'EAT', $tmp);
}
$tmp = preg_replace("/^EAT\s+(\S+).*/", "EAT $2", $tmp);
return $tmp;
}