0

我正在尝试将一些 xml 标签与正则表达式匹配这是我的 php 代码

   $pattern = '#<xt:tag_name *(type\="(.+?)")? *(detail\="(.+?)")? ?/>#ui';
   $str = '<xt:tag_name type="1" detail="2" />';
   preg_replace($pattern,"type: $1, detail: $4",$str);
   preg_match($pattern,$str,$m);
   print_r($m);

我得到了预期的结果

Array
(
    [0] => <xt:tag_name type="1" detail="2" />
    [1] => type="1"
    [2] => 1
    [3] => detail="2"
    [4] => 2
)

但是当我改变属性的顺序时

<xt:tag_name detail="2" type="1" />

匹配失败

4

1 回答 1

3

描述

这个正则表达式将捕获属性type并且detail不管属性顺序如何,只要它们在xt:tag_name标签内。

<xt:tag_name\b(?=\s)(?=(?:(?!\>).)*\s\btype=(["'])((?:(?!\1).)*)\1)(?=(?:(?!\>).)*\s\bdetail=(["'])((?:(?!\3).)*)\3)(?:(?!\>).)*\>

在此处输入图像描述

扩展描述

  • <xt:tag_name\b验证标签名称
  • (?=\s)确保标签名称后有一个空格
  • (?=前瞻 1 为type. 通过使用前瞻,您可以按任何顺序捕获属性。
    • (?:(?!\>).)*一次通过标记一个字符并防止正则表达式引擎退出此标记,直到您到达
    • \s\btype=属性type
    • (["'])捕获打开的引用,这将在以后用于匹配正确的关闭标记
    • ((?:(?!\1).)*)捕获引号内的所有字符,但不包括相同类型的封装引号
    • \1匹配关闭报价
    • )关闭前瞻type
  • (?=(?:(?!\>).)*\s\bdetail=(["'])((?:(?!\3).)*)\3)对名为的属性执行完全相同的detail操作type
  • (?:(?!\>).)*匹配所有字符直到
  • \>标签的结尾

团体

组 0 将具有从左括号到右括号的整个标签

  1. 将在值周围有打开引号type,这允许正则表达式正确匹配关闭引号
  2. 将具有来自属性的值type
  3. 将在值周围有打开引号detail,这允许正则表达式正确匹配关闭引号
  4. 将具有来自属性的值detail

PHP 代码示例:

输入字符串

<xt:tag_name UselessAttribute="some dumb string" type="1" detail="2" /><xt:tag_name detail="Things 'Punk' Loves" MoreUselessAttributes="1231" type="kittens" />

代码

<?php
$sourcestring="your source string";
preg_match_all('/<xt:tag_name\b(?=\s)(?=(?:(?!\>).)*\s\btype=(["\'])((?:(?!\1).)*)\1)(?=(?:(?!\>).)*\s\bdetail=(["\'])((?:(?!\3).)*)\3)(?:(?!\>).)*\>/ims',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

火柴

$matches Array:
(
[0] => Array
    (
        [0] => <xt:tag_name UselessAttribute="some dumb string" type="1" detail="2" />
        [1] => <xt:tag_name detail="Things 'Punk' Loves" MoreUselessAttributes="1231" type="kittens" />
    )

[1] => Array
    (
        [0] => "
        [1] => "
    )

[2] => Array
    (
        [0] => 1
        [1] => kittens
    )

[3] => Array
    (
        [0] => "
        [1] => "
    )

[4] => Array
    (
        [0] => 2
        [1] => Things 'Punk' Loves
    )
)
于 2013-06-19T00:49:50.887 回答