PHP 从两个逗号之间的字符串中删除字符串,其中字符串以特定项目开头

PHP remove string from a string between two commas where the string starts with specific item

我正在尝试删除以特定项目开头的较大字符串中两个逗号之间的字符串。

所以这是更大的字符串:-

#navMain ul li a,.navBreadCrumb1 .nav1 ul li,.top-specials

我有一个查询 selects .navBreadCrumb1,我希望能够删除从 .navBreadCrumb1 到下一个逗号的所有内容,这样上面的字符串将变为:-

#navMain ul li a,.top-specials

查询可以 select 多个项目(即它可以 selected #navMain - 在这种情况下我需要它删除 #navMain ul li a,)

我对 preg_replace() 很没用,我想我必须用它来实现这个目标,但老实说我不知道​​。

有人能帮忙吗?

有多种方法可以做到这一点,这里是一个示例,如果您只是想删除两个逗号之间的一段文本:

$string = '#navMain ul li a,.navBreadCrumb1 .nav1 ul li,.top-specials';
$stringArray = explode(',', $string);
$stringNew = $stringArray[0].','.$stringArray[2];
echo $stringNew;

Returns #navMain ul li a,.top-specials

此示例的唯一问题是必须做出的假设:

  • 字符串数组将 return 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]

您可以试验和使用的其他正则表达式模式,例如您使用 regex lookarounds 是这样的:

$lookaround = '/(?=,)(.*?)(?=,)/';
$newString = preg_replace($lookaround, '', $string);

由于模式与字符串中第一个和第二个逗号的关系,该模式与以下文本匹配:

,.navBreadCrumb1 .nav1 ul li

现在,我们创建的 $newStringpreg_replace() 的结果)完全包含您要查找的内容,即使在您检查大量字符串时正则表达式不是特别有效也是如此。没有串联,模式比我之前提供的示例要脆弱得多。我们基本上将第一个逗号到下一个逗号的部分替换为空,留下您要查找的字符串。