preg_replace for html tag <blockquote> </blockquote>

时间:2012-11-19 17:59:35

标签: php regex preg-replace

我有这2个字符串,并希望将其更改为html标签

1 : bq. sometext /* bq.+space+sometext+space or return

在这个字符串中。我希望将它转换为以bq。+空格开头并以空格结尾或返回

<blockquote author="author" timestamp="unix time in secs">sometext</blockquote>

在此字符串中

2:  [quote author="author" date="unix time in secs"]
    some text
    [/quote] /* start with [qoute and get the text of author property then get
                sometext form between ']' and '[/qoute]

我想将它们转换为:

<blockquote author="author" timestamp="unix time in secs">sometext</blockquote>

此regext无效!:

#\bq(.| )(.*?)\n#

1 个答案:

答案 0 :(得分:0)

你的逃跑有点混乱。转义b使其成为单词边界。不转义.使其成为任意字符,将.和空格置于交替意味着“要么......或......”。这个正则表达式应该照顾你的第一个例子:

$str = preg_replace(
    '#bq\. (\S+)#',
    '<blockquote author="author" timestamp="unix time in secs">$1</blockquote>',
    $str
);

如果有人用quote标记嵌套,那么第二个会让你麻烦。但是假设在quotes[quote...]之间没有其他[/quote],您可以使用以下内容:

$str = preg_replace(
    '#\[quote(?=[^\]]*author="([^"]*))(?=[^\]]*timestamp="([^"]*))[^\]]*\](.*?)\[/quote\]#s',
    '<blockquote author="$1" timestamp="$2">$3</blockquote>',
    $str
);

这使用两个lookaheads来查找属性,并在捕获组$1$2中捕获它们的值。并且所有这些都没有提升字符串中的实际位置。关于前瞻的好处是,它的工作独立于两个属性。然后我们匹配开始标记的其余部分,然后尽可能少地捕获(.*?),直到遇到[/quote]

Working demo.