在javascripts的{}问题之间的任何内容之间的preg_replace

时间:2014-02-05 00:31:13

标签: php preg-replace

我需要帮助来解决这个问题。我不熟悉preg模式,所以也许这很简单:)

我的模板系统中有一个preg_replace:

$code = preg_replace('#\{([a-z0-9\-_].*?)\}#is', '\1', $code);

工作正常,但如果我有一些像这个谷歌加按钮的JavaScript代码:

window.___gcfg = {lang: 'sk'};

它取代了这一个:

window.___gcfg = ;

我尝试了这种模式:#\{([a-z0-9\-_]*?)\}#is

这适用于gplus按钮,但当我有这样的时候(谷歌的adsense代码)(adsbygoogle = window.adsbygoogle || []).push({});

结果为(adsbygoogle = window.adsbygoogle || []).push();

我需要应用类似这样的规则,但我不知道为什么它不起作用

\{([a-z0-9-_])\} - 只需字母,数字,下划线和短划线。我还需要保留其他任何东西。

感谢您的回答。

编辑: 我需要的更简单的例子:

{SOMETHING} -> do rewrite
{A_SOMETHING} -> do rewrite
{} -> do not rewrite
{name : 'me'} -> do not rewrite

因此,如果除了a-z0-9-_之外还有其他内容,或者{}之间没有任何内容,那么就不要重写并跳过它。

2 个答案:

答案 0 :(得分:0)

所以,看起来你想要匹配花括号,其内容只是a-z0-9_-。 在这种情况下,请尝试:

$code = preg_replace('#\{([a-z0-9\-_]+?)\}#is',
                     'whatever_you_wanted_to_replace_with',
                     $code);

您的原始正则表达式“匹配[a-z0-9_-]后跟0或更多任何内容”(.*?)。 这个说“匹配[a-z0-9_-]中的一个或多个”。

至于你想用替换这些东西,你还没有说清楚,所以我假设你可以做到这一点。

答案 1 :(得分:0)

您可以尝试使用模式的第一部分搜索脚本子字符串,使用第二部分搜索模板标记。脚本子字符串将由其自身替换,并且模板标记将包含其内容。

由于模式使用分支重置功能(?|...|...),因此捕获组具有相同的数字(即数字1)

$pattern = '#(?|(<script\b(?>[^<]++|<(?!/script>))+</script>)|{([\w-]++)})#i';
$code = preg_replace($pattern, '$1', $code);

请注意,您可以在没有分支重置功能的情况下执行相同操作,但必须更改替换模式:

$pattern = '#(<script\b(?>[^<]++|<(?!/script>))+</script>)|{([\w-]++)}#i';
$code = preg_replace($pattern, '$1$2', $code);

另一种方法是使用回溯控制动词(*SKIP)(*FAIL)来跳过脚本子串。 (*SKIP)强制在其右侧的子模式失败时不重试子字符串(在其左侧与子模式匹配之前匹配)。 (*FAIL)使模式立即失败:

$pattern = '#<script\b(?>[^<]++|<(?!/script>))+</script>(*SKIP)(*FAIL)|{([\w-]++)}#i';
$code = preg_replace($pattern, '$1', $code);

与两个先例模式的不同之处在于,您根本不需要在替换模式中为脚本子串提供任何引用。