0

所以我之前发了一篇文章,但它被关闭了:(从那以后我已经设法取得了一点进展,我意识到我需要以某种方式获取[code][/code]标签内的内容str_replace()并对其中的笑脸 bbcode 文本进行操作,这就是我到目前为止所拥有的但它不工作

if (preg_match_all('~[code](.*?)[\/code]~i', $row['message'], $match)){

 foreach($match[1] AS $key) {
   $find    = array(':)',':(',':P',':D',':O',';)','B)',':confused:',':mad:',':redface:',':rolleyes:',':unsure:');
   $replace = array(':)',':(',':P',':D',':O','&#59;)','B)',':confused:',':mad:',':redface:',':rolleyes:',':unsure:');
}
 $message = str_replace($find, $replace, $key);
  } else {
 $message = $row['message'];
}

它根本不返回任何消息内容。

如果我改变这一行:

$message = str_replace($find, $replace, $key);

对此:

$message = str_replace($find, $replace, $row['message']);

它有点工作,但替换了整个消息中的所有笑脸,而不是[code][/code]我认为由$key? 表示的标签内的内容?...任何帮助都请它导致我的大脑超负荷!

我确实发现这个问题与我的不同但非常相关,但没有真正的答案。

4

1 回答 1

0

我认为您可能更容易使用现有的 BBCode 解析器(例如NBBC),或者至少检查他们是如何做到的。他们以一种更聪明的方式做到了。他们不使用正则表达式,而是使用词法分析器,将其拆分为单独的标签(如下所示)。然后,他们只是不对 [code] 标签做任何事情。如果您仍然想继续使用您的解决方案,我会首先将它们拆分为数组(bbcode = explode('[code]', bbcode)然后对于 [code] 也是如此。每个第二个列表元素都不应使用其他解析。如前所述:没有目的在重新发明轮子时,所以不要那样做。

这就是他们的解决方案的工作原理:

[b]Hello![/b]
[code]
#/usr/bin/python
import antigravity
[/code]
Python is much more awesome.

变成例如。包含以下元素的数组:

  1. [b]Hello![/b]
  2. [code]…[/code]
  3. Python is much more awesome.

然后它应用它应该应用的格式。更好,更人性化。

由于篇幅原因,不予置评。

于 2012-12-23T15:08:30.953 回答