如何指定正则表达式搜索组?

时间:2014-03-08 12:07:10

标签: php regex

我想用preg_filter替换我的自定义creted标签来实现JS脚本:

preg_filter(
    "/<!--@SCRIPT-->.*$<!--@SCRIPT-->/", 
    '<script type="text/javascript" src="$0"></script>', 
    '<!--@SCRIPT-->/test.js<!--@SCRIPT-->
);

自: <!--@SCRIPT-->/test.js<!--@SCRIPT-->

我得到: <script type="text/javascript" src="<!--@SCRIPT-->/test.js<!--@SCRIPT-->"></script>

如何重写该正则表达式以使$0组不包围<!--@SCRIPT-->

换句话说,如何缩小这个群体以获得:

<script type="text/javascript" src="/test.js"></script>

2 个答案:

答案 0 :(得分:2)

您必须使用捕获组(...)来提取标记之间的内容。然后,您可以使用$1在替换字符串中引用它。

$result = preg_filter('~<!--@SCRIPT-->([^<]*)<!--@SCRIPT-->~', 
                      '<script type="text/javascript" src="$1"></script>', 
                      '<!--@SCRIPT-->/test.js<!--@SCRIPT-->');

这适用于我们的特定情况,但是我不确定preg_filter()是完成此任务的好选择,因为如果没有匹配则返回空字符串。最好以同样的方式使用preg_replace()

$result = preg_replace('~<!--@SCRIPT-->([^<]*)<!--@SCRIPT-->~', 
                       '<script type="text/javascript" src="$1"></script>', 
                       '<!--@SCRIPT-->/test.js<!--@SCRIPT-->');

答案 1 :(得分:0)

试试这个 -

preg_filter(
"/<!--@SCRIPT-->(.*?)<!--@SCRIPT-->/", 
'<script type="text/javascript" src="$1"></script>', 
'<!--@SCRIPT-->/test.js<!--@SCRIPT-->'
)
/* OUTPUT */
string '<script type="text/javascript" src="/test.js"></script>' (length=55)