我试图在一个以特定项开头的较大字符串中删除两个逗号之间的字符串。
所以这是更大的字符串:-
#navMain ul li a,.navBreadCrumb1 .nav1 ul li,.top-specials
我有一个查询,选择。navbreadcrumb1,我希望能够删除一切从。navbreadcrumb1到下一个逗号,所以上面的字符串将成为:-
#navMain ul li a,.top-specials
查询可以选择多个项目(即它可以选择#navMain -在这种情况下,我需要它删除#navMain,)
我对preg_replace()非常无能,我想我必须使用它来实现这一点,但老实说,我没有线索。
有人能帮忙吗?
有很多方法可以做到这一点,这里有一个例子,如果你想要摆脱两个逗号之间的一段文本:
$string = '#navMain ul li a,.navBreadCrumb1 .nav1 ul li,.top-specials';
$stringArray = explode(',', $string);
$stringNew = $stringArray[0].','.$stringArray[2];
echo $stringNew;
返回#navMain ul li a,.top-specials
这个例子的唯一问题是必须做出的假设:
- 字符串的数组将返回3项
- 它实际上只是一个字符串而不是标记
- 它真的就像在你爆炸字符串 之后连接你想要的部分一样简单
现在,使用preg_match()
,您可以使用正则表达式模式获得另一个数组:
(.*?,)(.*?,)(.*)
第一组匹配到第一个逗号,第二组匹配到下一个逗号,然后是字符串的其余部分。你可以像这样编写代码,使用上面的$string
:
$pattern = '/(.*?,)(.*?,)(.*)/';
preg_match($pattern, $string, $matches);
$matches
将包含以下数组:
Array
(
[0] => #navMain ul li a,.navBreadCrumb1 .nav1 ul li,.top-specials
[1] => #navMain ul li a,
[2] => .navBreadCrumb1 .nav1 ul li,
[3] => .top-specials
)
要得到你想要的结果,你最终会连接$matches[1] . ',' . $matches[3]
是你可以尝试和使用的其他正则表达式模式,例如你使用像这样的正则表达式遍历:
$lookaround = '/(?=,)(.*?)(?=,)/';
$newString = preg_replace($lookaround, '', $string);
模式匹配下面的文本,因为它与字符串中第一个和第二个逗号的关系:
,.navBreadCrumb1 .nav1 ul li
现在我们创建的$newString
(preg_replace()
的结果)包含了你正在寻找的东西,即使regex不是特别有效,如果你检查很多字符串。这里没有串联,而且模式比我前面提供的示例要脆弱得多。实际上,我们将第一个逗号到下一个逗号之间的部分替换为空,留下要查找的字符串。