我有这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#
答案 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]
。