我有这2个字符串,并希望将其更改为html标记
1 : bq. sometext /* bq.+space+sometext+space or return在这个字符串中,我想将它转换为以bq.+space开头,以空格或return结尾的字符串
<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>此正则表达式不起作用!
#\bq(.| )(.*?)\n#发布于 2012-11-20 02:07:59
你把你的逃生搞混了。转义b使其成为单词边界。不对.进行转义将使其成为任意字符,将.和空格放在交替位置表示“不是...就是...”。这个正则表达式将处理您的第一个示例:
$str = preg_replace(
'#bq\. (\S+)#',
'<blockquote author="author" timestamp="unix time in secs">$1</blockquote>',
$str
);如果有人将它嵌套在quote标记中,那么第二个将会给您带来麻烦。但是假设在[quote...]和[/quote]之间没有其他的quotes,你可以使用这样的东西:
$str = preg_replace(
'#\[quote(?=[^\]]*author="([^"]*))(?=[^\]]*timestamp="([^"]*))[^\]]*\](.*?)\[/quote\]#s',
'<blockquote author="$1" timestamp="$2">$3</blockquote>',
$str
);这使用两个lookaheads来查找属性,并在捕获组$1和$2中捕获它们的值。所有这些都没有推进字符串中的实际位置。lookaheads的好处是,它独立于这两个属性工作。然后我们匹配开始标记的其余部分,然后尽可能少地捕获(.*?),直到遇到[/quote]。
Working demo.
https://stackoverflow.com/questions/13459451
复制相似问题