【问题标题】:Regex with variable content具有可变内容的正则表达式
【发布时间】:2010-12-09 21:55:49
【问题描述】:

我正在尝试用 PHP 编写某种解析器:它接收包含 #*test-var*# 之间的变量的文本,例如:blabla #test-var# blabla 我要做的是调整此文本,使其变为:blabla <p>test-var</p> blabla

最重要的是,变量的类型可以改变,例如:blabla #*:test-var*# blabla 应该变成:blabla <div>test-var</div>

(我在这里使用了一些HTML简单标签(例如<p>标签)来解释它,但最终这应该成为更高级的HTML)

有人有什么建议吗?

【问题讨论】:

  • SO 允许您使用某些 HTML 标签来标记您的问题,因此如果您希望它们显示为正常内容,您应该使用 HTML 实体,或者最好用反引号将标签括起来(即 `)将它们标记为代码示例。

标签: php regex


【解决方案1】:

一些简单的正则表达式就可以了。

$string = 'blah blah #*test-var*# blah blah';
$types = array(
    array(
        '/#\*(.*?)\*#/',
        '<p>$1</p>'
    ),
    array(
        '/#\*:(.*?)\*#/',
        '<div>$1</div>'
    )
);
foreach ($types as $type) {
    $string = preg_replace($type[0], $type[1], $string);
}

编辑:添加了对多个标签的支持。

【讨论】:

  • 嗯,问题是#*....*# 的内容标识了输出的类型,所以我担心这行不通
  • 应该使用非贪婪标志,以防它们在一个字符串中有多个“标签”。
  • @Brad Christie:表达式中有一个问号;我很确定这会杀死贪婪。
  • 是的,我的措辞很差。我同意这个答案,并认为它是最合适的(直到我看到 user485659 的评论),但为了最初的问题,更重要的是为不贪婪的标志带来光明。这里接近 5:30 - 接近下班时间(想想我的头脑已经开始了)
【解决方案2】:
function some_kind_of_parser($input, $wrapper_tag='p', $wrapper_attributes='') {
  if ($wrapper_attributes == '')
    $open_tag = "<$wrapper_tag>";
  else
    $open_tag = "<$wrapper_tag $wrapper_attributes>";

  $close_tag ="</$wrapper_tag>";

  $regex = '/[^(?:#\*)]+#\*([^(#\*)]+)\*#[^(?:#\*)]+/';
  return preg_replace($regex, "$open_tag$1$close_tag", $input);
}

$test = 'blah blah #*test-var*# blah blah';

echo some_kind_of_parser($test); 
# => <p>test-var</p>

echo some_kind_of_parser($test, 'div', 'class="foo" id ="bar"');   
# => <div class="foo" id ="bar">test-var</div>

【讨论】:

    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2014-08-17
    • 2018-06-24
    • 2011-04-13
    相关资源
    最近更新 更多