我想在两个字符串上使用PHP preg_replace函数,但我不确定要使用的正则表达式。
对于第一个字符串,我只需要作者值(所以author=
之后的所有内容,但空格后没有任何内容):
[quote author=username link=1150111054/0#7 date=1150151926]
结果:
[quote=username]
对于第二个字符串,没有author=
标记。用户名只是在关闭的公开引用
[quote] username link=1142890417/0#43 date=1156429613]
理想情况下,结果应为:
[quote=username]
答案 0 :(得分:1)
第一个:/author=(.*?) /
第二个/\[quote\] (.*?) /
在你的情况下:
$str1 = "[quote author=username link=1150111054/0#7 date=1150151926]";
$str2 = "[quote] username link=1142890417/0#43 date=1156429613]";
$regex1 = '/author=(.*?) /';
$regex2 = '/\[quote\] (.*?) /';
if (preg_match($regex1, $str1, $match1))
echo '[quote='.$newStr1 = $match1[1].']';
if (preg_match($regex2, $str2, $match2))
echo '[quote='.$newStr2 = $match2[1].']';
答案 1 :(得分:1)
将字符串author=
和]
设为可选,以便对两种类型的字符串进行替换。
<强>正则表达式:强>
^\[(\S+?)\]?\s+(?:author=)?(\S+).*$
如果您想在正则表达式中提及字符串quote
,请使用此
^\[(quote)\]?\s+(?:author=)?(\S+).*$
替换字符串:
[$1=$2]
<?php
$string =<<<EOT
[quote author=username link=1150111054/0#7 date=1150151926]
[quote] username link=1142890417/0#43 date=1156429613]
EOT;
echo preg_replace("~^\[(\S+?)\]?\s+(?:author=)?(\S+).*$~m", "[$1=$2]", $string);
?>
<强>输出:强>
[quote=username]
[quote=username]
答案 2 :(得分:0)
这是使用单个正则表达式处理两者的另一种方法。
# Find: '~(?|\[quote\]\s*(\S+).*|\[quote\s+author=\s*(\S+).*)~'
# Replace: '[author=$1]'
(?|
\[quote\] \s*
( \S+ )
.*
|
\[quote \s+ author= \s*
( \S+ )
.*
)
输入:
[quote author=username link=1150111054/0#7 date=1150151926]
[quote] username link=1142890417/0#43 date=1156429613]
输出:
[author=username]
[author=username]