描述
这个正则表达式将捕获属性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 将具有从左括号到右括号的整个标签
- 将在值周围有打开引号
type
,这允许正则表达式正确匹配关闭引号
- 将具有来自属性的值
type
- 将在值周围有打开引号
detail
,这允许正则表达式正确匹配关闭引号
- 将具有来自属性的值
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
)
)