正则表达式帮助 - 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,因此您应该检查它:
按步骤工作:
使用explode(",", $string);
:这会创建一个数组。它的条目应该类似于:{[0]=> "AudienceTypes=Internal", [1]=>" InternallearnerName=Ryan Litwiller"} ...
。注意空格。尝试清理它们。
继续每个数组项,然后像以前一样再次拆分它。然后,再次使用 explode()
函数,这次是 explode("=", $array[$arrayItemNum]);
.
有关详细信息,请参阅 PHP Manual explode()
page。
正则表达式:
\bInternallearnerName=([^;]+)
这意味着什么:
- 找到一个分词符(非字母字符)
- 在字符串中的任意位置找到 InternallearnerName=
- 开始标记匹配(例如:捕获文本)(
- 从集合 [ ] 中找出一个或多个 + 个不 ^[=35 的字符=] 包含一个分号 ;
- 结束标记匹配 )
请注意,这失败了:
InternallearnerName=;
如果您关心这种情况,请将 +(一个或多个)更改为 *(零个或多个)
希望我不会因此被打。我是正则表达式的新手,我知道那里有大量资源,但我的问题是我想做一些具体的事情,但我似乎无法弄清楚如何将表达式拼凑在一起。
假设这是我的字符串的片段:
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,因此您应该检查它:
按步骤工作:
使用
explode(",", $string);
:这会创建一个数组。它的条目应该类似于:{[0]=> "AudienceTypes=Internal", [1]=>" InternallearnerName=Ryan Litwiller"} ...
。注意空格。尝试清理它们。继续每个数组项,然后像以前一样再次拆分它。然后,再次使用
explode()
函数,这次是explode("=", $array[$arrayItemNum]);
.
有关详细信息,请参阅 PHP Manual explode()
page。
正则表达式:
\bInternallearnerName=([^;]+)
这意味着什么:
- 找到一个分词符(非字母字符)
- 在字符串中的任意位置找到 InternallearnerName=
- 开始标记匹配(例如:捕获文本)(
- 从集合 [ ] 中找出一个或多个 + 个不 ^[=35 的字符=] 包含一个分号 ;
- 结束标记匹配 )
请注意,这失败了:
InternallearnerName=;
如果您关心这种情况,请将 +(一个或多个)更改为 *(零个或多个)