0

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

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

在此字符串中。我想将其转换为以 bq.+space 开头并以空格结尾或返回的字符串

<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#
4

1 回答 1

0

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

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

如果有人用quote标记嵌套它,第二个会给你带来麻烦。但是假设 and 之间没有其他的quotes,你可以使用这样的东西:[quote...][/quote]

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

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

工作演示。

于 2012-11-19T18:07:58.977 回答