string string {format mat=34/} string string string string string string string string
string string {format mat=34/} string string string string string string string string
$ pattern =“/ {format [a-z0-9 = \ s] * \ /} / i”;
str_replace($ pattern,'test',$ strings);
它将替换字符串中的所有格式,我想只替换第一个“格式”,并删除所有其他“格式”。怎么样 ?
获取匹配结果为“{format mat = 34 /}”。我想找到以“mat =”开头的字符串。
所以我有这个
$string = "{format mat=34/}";
$pattern = "/^mat=[0-9]*/"; // result is null
$pattern = "/mat=[0-9]*/"; // ok, but also effect with "{format wrongformat=34/}"
如何匹配以“mat =”开头的字符串
答案 0 :(得分:1)
(问题的第一部分)
您可以将第一种格式与此正则表达式匹配,后者使用{n}指定仅匹配第一次出现
$pattern = "(^.*?\{format[a-z0-9=\s]*\}.){1}"
从第一个字符开始,在第一个格式之前进行非贪婪匹配,然后恰好{1}出现。
运行此操作以进行初始替换,然后在其他格式上执行正常的str_replace。
答案 1 :(得分:1)
以下是您的解决方案:
$string = "string {format mat=34/} string string string {format mat=34/} string string string string {format mat=34/} string string string string string ";
// replace first match with 'test'
$string = preg_replace('/\{format mat=[\d]*\/\}/', 'test', $string, 1);
// remove all other matches
$string = preg_replace('/\{format mat=[\d]*\/\}/', '', $string);
答案 2 :(得分:0)
对于您的第一个问题,您可以使用某种str_replace_once()
PHP manual comments中的示例:
function str_replace_once($str_pattern, $str_replacement, $string)
{
if (strpos($string, $str_pattern) !== false)
{
$occurrence = strpos($string, $str_pattern);
return substr_replace($string, $str_replacement, strpos($string, $str_pattern), strlen($str_pattern));
}
return $string;
}
要删除所有其他比赛,请参阅Sergej的回答:)
关于你的第二个问题:
$string = '{format mat=34/}';
preg_match("|\s(mat=[0-9]+)/\}$|", $string, $matches);
print_r($matches); // $matches[1] contains 'mat=34'
答案 3 :(得分:0)
使用\ b - 单词边界。
$ pattern ='/ \ bmat = [0-9] * /';