希望我不会因为这件事而受到殴打。我是正则表达式的新手,我知道那里有大量的资源,但我的问题是我想做一些具体的事情,我似乎无法弄清楚如何将表达式拼凑在一起。
说这是我的字符串片段:
AudienceTypes =内部; InternallearnerName = Ryan Litwiller; UNAME = 227812;
我想搜索InternallearnerName=
并将=之后的内容存储为半冒号作为变量。
作为preg_match()
的替代方案,我尝试使用preg_split
分号,array_search()
,然后substr()
开始使用{{1}}来制定解决方案,但实际上我认为正则表达式是更简单的解决方案。
答案 0 :(得分:2)
你走了:
<?php
$s='AudienceTypes=Internal; InternallearnerName=Ryan Litwiller; uName=227812;';
preg_match( '/\bInternallearnerName=([^;]+)/', $s, $matches );
echo $matches[1], "\n";
正则表达式:
\b
表示'字边界',因此与FOOInternallearnerName=...
(
.. )
定义了一个群组;第一对将是1号。[^
.. ]
是单个字符,不是(^
)以下之一;在这种情况下;
。因此,它匹配除 ;
之外的任何字符。+
表示1个或更多。 $matches
将存储匹配项。 $matches[0]
将存储整个匹配的字符串,$matches[1]
将存储第一个组。 ($matches[2]
会存储第二个,但正则表达式中只有一个组(
.. )
。
要匹配uName
的值,请使用此选项:
preg_match( '/\bInternallearnerName=([^;]+.*?\buName=([^;]+)/', $s, $matches );
此处,$matches[2]
将为227812
。
请注意,在这种情况下,正则表达式的第一个和最后一个字符/
仅用于标记正则表达式的开头/结尾。严格来说,他们不是必需的,但这可能是遗产。你也可以在那里使用其他角色;例如,如果您匹配的是网址或文件路径,则可以使用@
:preg_match( "@.....@", ....)
。
此外,preg_match
如果没有匹配则返回false,因此您应该检查它:
答案 1 :(得分:1)
一些例子
使用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
答案 2 :(得分:1)
正则表达式:
\bInternallearnerName=([^;]+)
这意味着什么:
请注意,此操作失败:
InternallearnerName=;
如果您关心这种情况,请将 + (一个或多个)更改为*(零或更多)
答案 3 :(得分:0)
分步工作:
使用explode(",", $string);
:这会创建一个数组。其条目应如下所示:{[0]=> "AudienceTypes=Internal", [1]=>" InternallearnerName=Ryan Litwiller"} ...
。注意空格。尽量清理它们。
继续使用每个数组项,并再次拆分,就像之前一样。然后,再次使用explode()
函数,这次explode("=", $array[$arrayItemNum]);
。
有关详细信息,请参阅PHP Manual explode()
page。