【问题标题】:Preg_Match_All: two values in a patternPreg_Match_All:模式中的两个值
【发布时间】:2010-10-04 20:16:56
【问题描述】:

我有自定义标签[tag val=100][/tag]。如何获得val 以及标签之间的内容?

例如:

[tag val=100]apple[/tag]  

值1 = 100
value2 = 苹果

编辑:如果标签内有多个项目怎么办
例如:

[tag val=100 id=3]

【问题讨论】:

  • 标签是否可嵌套,例如[tag val=100]fruits: [tag2]apples[/tag2] and pears[/tag]
  • 关于您的编辑:内部可用属性的选择是否固定?或者你想检查任何可能的事情吗?
  • 如果你要求一个regular表达式,那么你应该清楚regularity

标签: php regex tags preg-match-all


【解决方案1】:

如果您的问题中有这样的字符串,您可以使用preg_match 而不是preg_match_all

$str = "[tag val=100]apple[/tag]";

preg_match("/\[.+? val=(.+?)\](.+?)\[\/.+?\]/", $str, $matches);

$value = $matches[1];    // "100"
$content = $matches[2];  // "apple"

更新:我发现每个元素中可能有多个属性。在这种情况下,这应该有效:

// captures all attributes in one group, and the value in another group
preg_match("/\[.+?((?:\s+.+?=.+?)+)\](.+?)\[\/.+?\]/", $str, $matches);

$attributes = $matches[1];
$content = $matches[2];

// split attributes into multiple "key=value" pairs
$param_pairs = preg_split("/\s+/", $attributes, -1, PREG_SPLIT_NO_EMPTY);
// create dictionary of attributes
$params = array();
foreach ($param_pairs as $pair) {
    $key_value = explode("=", $pair);
    $params[$key_value[0]] = $key_value[1];
}

【讨论】:

  • 您可以稍微调整 RE 以限制可用于属性名称和值的字符。我用过.+?,但你可以把它改成[A-Za-z]+?或类似的东西。
【解决方案2】:

这将是它的正则表达式:

'#\[tag val=([0-9]+)\]([a-zA-Z]+)\[\/tag])#'

Val 是一个数字,而您的“苹果”可以是一个或多个字母字符。如果要匹配更多字符,请将[a-zA-Z]+ 替换为.+?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2014-05-27
    • 2019-07-03
    相关资源
    最近更新 更多