【问题标题】:preg_replace everything but content within bbcodepreg_replace 除了 bbcode 中的内容之外的所有内容
【发布时间】:2012-08-01 19:19:49
【问题描述】:

我正在尝试用空白空间替换我的内容中的所有内容,除了我的 bbcode 中的内容(以及 bbcode 本身)。

这是我的代码来消除我的 bbcode。 BBCode 只是识别重要内容的小帮手。

$content = preg_replace ( '/\[lang_chooser\](.*?)\[\/lang_chooser\]/is' , '$1' , $content );

难道不能直接否定这段代码吗?

$content = preg_replace ( '/^[\[lang_chooser\](.*?)\[\/lang_chooser\]]/is' , '' , $content );

干杯并感谢四位您的帮助!

编辑 这是我的解决方案(抱歉,我目前无法回答我自己的问题)

$firstOcc = stripos($content, '[lang_chooser]');
$lastOcc = stripos($content, '[/lang_chooser]');
$content = substr($content, $firstOcc, $lastOcc + strlen('[/lang_chooser]') - $firstOcc);
$content = preg_replace('/' . addcslashes('[lang_chooser](.*?)[/lang_chooser]', '/[]') . '/is', '$1', $content);

我认为这不是最好的解决方案,但它目前有效。 也许有更好的方法来做到这一点;-)

【问题讨论】:

  • 您是否像我建议的那样查看了 preg_match ?我认为它比你现在拥有的更正确。同样,您的问题似乎表明您想保留 bbcode ...您的解决方案将其丢弃。另外,如果您已经使用 substring 来获取字符串的一部分,那么 preg_replace 的用途是什么?正则表达式的存在是为了更容易找到字符串中的偏移量......

标签: php preg-replace bbcode


【解决方案1】:

除了字符类之外,^ 字符不取反。这意味着匹配字符串的开头(如果您处于多行模式,则匹配该行)。

可以有否定的前瞻和后视,但我认为不能否定整个正则表达式。

如果您只想用该字符串的一部分替换字符串,请使用 preg_match 并将匹配数组分配给您的文本

if( preg_match ( '/(\[lang_chooser\].*?\[\/lang_chooser\])/is', $content, $matches ) )

    echo $matches[ 0 ]; // should have what you want

为了便于阅读,我使用 addcslashes 来转义 / 和 [:

if( preg_match ( '/' . addcslashes( '([lang_chooser].*?[/lang_chooser])', '/[]' ) . '/is', $content, $matches ) )

addcslashes 最好的部分是您可以获取任何正则表达式(来自变量、来自搜索框值、来自配置)并安全地调用 preg 函数,而无需担心使用什么分隔符。

您可能还需要 u 修饰符以符合 unicode 规范,除非出于某种奇怪的原因您不使用 utf-8:

if( preg_match ( '/' . addcslashes( '([lang_chooser].*?[/lang_chooser])', '/[]' ) . '/isu', $content, $matches ) )

与此同时,我稍微改进了 addlashes 方法。它允许在正则表达式中使用字符串文字,而不必担心元字符。 Xeoncross 指出 preg_quote。拥有这样的转义类可能仍然很好,因此您可以从某个地方获取固定分隔符以保持代码更整洁。此外,您可能希望在某个时候添加其他正则表达式风格,或者能够在不更改其余代码库的情况下捕捉未来对 preg_quote 的更改。目前只支持pcre:

class Escape
{
    /*
     * escapes meta characters in strings in order to put them in regular expressions
     * 
     * usage:
     * pcre_replace( '/' . Escape::pcre( $text ) . '/u', $string );
     * 
     */

    static
    function pcre( $string )
    {
        return

            preg_quote( $string, '/' )

        ;
    }
}

【讨论】:

  • 嗨,嗯...好吧,我认为可以否定整个正则表达式。你知道解决我问题的另一种方法吗?也许我必须解释我想做的事情:我有 两个 页的 一个 内容,在第一页上我必须只显示语言选择器,在第二页上我必须只显示其他内容。这听起来很奇怪,我知道 ;-)
  • 感谢您对 addcslashes 的建议 ;)
  • 你为什么不用preg_quote()
  • @Xeoncross 你是绝对正确的。我不知道那个功能......我会更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
相关资源
最近更新 更多