BBCode引用标记的Preg_replace模式

时间:2014-09-19 16:04:13

标签: php regex

我想在两个字符串上使用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]

3 个答案:

答案 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]

DEMO

<?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]