preg_match_all:匹配自定义标签

时间:2012-12-06 11:45:31

标签: php preg-match-all

我目前正在使用正则表达式,并希望在我的网站上为文本实现某种自定义标记。例如,如果我想将图片实现为文本,我使用以下括号标记来执行此操作...

  

Lorem ipsum dolor sit amet (图片:tiger.jpg宽度:120高度:200   标题:这张照片显示的是一只老虎) sed diam nonumy eirmod tempor   invidunt

现在我想要我的PHP脚本1.找到这些括号标签和2.读取这个括号中的单个标签,所以我得到某种类似的数组......

$attributes = array(
    'image' => 'tiger.jpg',
    'width' => '150',
    'height' => '250',
    'title' => 'This picture shows a tiger',
);

(对我而言)关于这一点的棘手部分是“值”可以包含所有内容,只要它不包含(\w+)\:之类的东西 - 因为这是不同标记的开头。下面的代码片段代表了我到目前为止的内容 - 找到括号 - 事情到目前为止工作,但将括号内容拆分为单个标记并不真正起作用。我使用(\w+)来匹配值作为占位符 - 这与“tiger.jpg”或“此图显示老虎”或其他内容不匹配。我希望你明白我的意思! ;)

<?php

$text = 'Lorem ipsum dolor sit amet (image: tiger.jpg width: 150 height: 250 title: This picture shows a tiger) sed diam nonumy eirmod tempor invidunt';

// find all tag-groups in brackets
preg_match_all('/\((.*)\)/s', $text, $matches);

// found tags?
if(!empty($matches[0])) {

    // loop through the tags
    foreach($matches[0] as $key => $val) {

        $search = $matches[0][$key]; // this will be replaced later
        $cache = $matches[1][$key]; // this is the tag without brackets

        preg_match_all('/(\w+)\: (\w+)/s', $cache, $list); // find tags in the tag-group (i.e. image, width, …)

        echo '<pre>'.print_r($list, true).'</pre>';

    }

}

?>

如果有人能帮我解决这个问题会很棒!谢谢! :)

1 个答案:

答案 0 :(得分:0)

<?

$text = 'Lorem ipsum dolor sit amet (image: tiger.jpg width: 150 height: 250 title: This picture shows a tiger) sed diam nonumy eirmod tempor invidunt';

// find all tag-groups in brackets
preg_match_all('/\(([^\)]+)\)/s', $text, $matches);
$attributes = array();

// found tags?
if ($matches[0]) {
    $m = preg_split('/\s*(\w+)\:\s+/', $matches[1][0], -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    for ($i = 0; $i < count($m); $i+=2) $attributes[$m[$i]] = $m[$i + 1];
}

var_export($attributes);

/*
array (
  'image' => 'tiger.jpg',
  'width' => '150',
  'height' => '250',
  'title' => 'This picture shows a tiger',
)
*/