正则表达式帮助 - PHP - preg_match()

Regular Expression Help - PHP - preg_match()

希望我不会因此被打。我是正则表达式的新手,我知道那里有大量资源,但我的问题是我想做一些具体的事情,但我似乎无法弄清楚如何将表达式拼凑在一起。

假设这是我的字符串的片段:

AudienceTypes=Internal; InternallearnerName=Ryan Litwiller; uName=227812;

我想搜索 InternallearnerName= 并将 = 到分号之后的内容存储为变量。

作为 preg_match() 的替代方案,我尝试开始使用 preg_split 分号,array_search(),然后 substr() 来制定解决方案,但我真的认为正则表达式会是一个更简单的解决方案。

一些例子

使用preg_match():

$text = "AudienceTypes=Internal; InternallearnerName=Ryan Litwiller; uName=227812;";
preg_match("/InternallearnerName=(.*?);/i",$text,$output);
echo $output[1];

输出:

Ryan Litwiller

您可以选择使用 explode()。路途遥远。

$text = "AudienceTypes=Internal; InternallearnerName=Ryan Litwiller; uName=227812;";
$value = explode("InternallearnerName=",$text);
$value = explode(";",$value[1]);
echo $value[0];

输出:

Ryan Litwiller

给你:

<?php
$s='AudienceTypes=Internal; InternallearnerName=Ryan Litwiller; uName=227812;';
preg_match( '/\bInternallearnerName=([^;]+)/', $s, $matches );
echo $matches[1], "\n";

正则表达式:

  • \b表示'word boundary',所以不会匹配FOOInternallearnerName=...
  • (..)定义一个组;第一对将是数字 1。
  • [^..] 是单个字符,不是 (^) 以下之一;在这种情况下 ;。因此,它匹配任何字符 除了 ;.
  • +表示1个或多个。

$matches 将存储匹配项。 $matches[0] 将存储整个匹配的字符串,$matches[1] 第一组。 ($matches[2] 会存储第二个,除非你在正则表达式中只有一组 (..)

要匹配 uName 的值,请使用:

preg_match( '/\bInternallearnerName=([^;]+.*?\buName=([^;]+)/', $s, $matches );

在这里,$matches[2] 将是 227812

请注意,正则表达式的第一个和最后一个字符,在本例中为 /,仅用于标记正则表达式的 beginning/ending。严格来说,它们不是必需的,但这可能是遗留问题。您也可以在那里使用其他字符;例如,如果您要匹配 URL 或文件路径,您可以使用 @: preg_match( "@.....@", ....).

此外,preg_match returns 如果没有匹配则为 false,因此您应该检查它:

按步骤工作:

  1. 使用explode(",", $string);:这会创建一个数组。它的条目应该类似于:{[0]=> "AudienceTypes=Internal", [1]=>" InternallearnerName=Ryan Litwiller"} ...。注意空格。尝试清理它们。

  2. 继续每个数组项,然后像以前一样再次拆分它。然后,再次使用 explode() 函数,这次是 explode("=", $array[$arrayItemNum]);.

有关详细信息,请参阅 PHP Manual explode() page

正则表达式:

\bInternallearnerName=([^;]+)

这意味着什么:

  • 找到一个分词符(非字母字符)
  • 在字符串中的任意位置找到 InternallearnerName=
  • 开始标记匹配(例如:捕获文本)(
  • 从集合 [ ] 中找出一个或多个 + 个不 ^[=35 的字符=] 包含一个分号 ;
  • 结束标记匹配 )

请注意,这失败了:

InternallearnerName=;

如果您关心这种情况,请将 +(一个或多个)更改为 *(零个或多个)