【问题标题】:Set a variable on regular expression在正则表达式上设置变量
【发布时间】:2013-10-31 14:26:30
【问题描述】:

可以将变量声明为正则表达式吗?例如,我有一个匹配两种数据类型的表达式,我想定义一个变量来告知匹配的类型。

~ ( \d+ | \w+ ) ~x

它将匹配数字或字符。我想存储匹配数据类型的信息(手动)。例如:

~ ( (?<type>"int") \d+ | <?<type>"string"> \w+ ) ~x

所以结果是:

"123" -> { 0: "123", "type": "int",    1: "123" }
"ABC" -> { 0: "ABC", "type": "string", 1: "ABC" }

我得到的最接近的解决方案是定义一个包含此类信息的组,并以特定方式命名。

~ ( (?<type_int> \d+) | (?<type_string> \w+) ) ~x

在这种情况下,结果是:

"123" -> { 0: "123", "type_int": "123" }
"ABC" -> { 0: "ABC", "type_string": "ABC" }

【问题讨论】:

  • 我认为您提出的解决方案是最好的方法。
  • 您可以循环遍历数组并使用我在this answer中编写的以下函数
  • @HamZa 谢谢,但我给出的例子只是为了理解。信息的类型不一定是主题数据的类型。例如,它可以是“电子邮件”类型。
  • @DavidRodrigues 那么,我认为您使用命名组的解决方案是可行的方法。

标签: php regex


【解决方案1】:

正则表达式并不是为了解决这些问题而设计的,但有一个解决方案是可能的,尽管这是一个“hack”:

$text= "some text 1234";
$regex= <<< THISISREGEX
/
(
    (\\d++) |
    \\w++
)
(?=.*
    (?P<type>
        (?(2)int|string)
    )
)
(?!
    .{,9}\$(?<=intstring)
)
/xs
THISISREGEX;
preg_match_all($regex, $text."intstring", $arr);
for ($i=0; $i<sizeof($arr[0]); $i++) {
    echo $arr[1][$i]."\t\t".$arr["type"][$i]."\n";
};

输出:

some        string
text        string
1234        int

IDEone example

【讨论】:

  • 另一个“肮脏”的解决方案,证明你不应该对此类任务使用正则表达式IDEone
  • 尽管是个 hack,但值得付出努力。这正是我所期望的。我将继续使用我自己的方法,但如果你准确地说出了我的问题,那么你值得称赞。只有一个补充:你能简单解释一下这个正则表达式吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
相关资源
最近更新 更多