PHP удалить строку из строки между двумя запятыми, где строка начинается с определенного элемента

#php #string #preg-replace #str-replace

#php #строка #preg-replace #str-replace

Вопрос:

Я пытаюсь удалить строку между двумя запятыми в более крупной строке, которая начинается с определенного элемента.

Итак, это строка большего размера:-

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

У меня есть запрос, который выбирает.navBreadCrumb1 и я хочу иметь возможность удалять все из .navBreadCrumb1 до следующей запятой, чтобы строка выше стала:-

 #navMain ul li a,.top-specials
 

Запрос может выбрать несколько элементов (т.Е. Он мог бы выбрать #navMain — в этом случае мне нужно было бы удалить #navMain ul li a,)

Я довольно бесполезен с preg_replace(), и я предполагаю, что мне пришлось бы использовать это для достижения этой цели, но, честно говоря, понятия не имею.

Может ли кто-нибудь помочь?

Комментарии:

1. Можете ли вы показать, что у вас уже есть, чтобы мы могли извлечь это оттуда?

2. Время освежить синтаксис шаблона PHP . Если a . нужно экранировать и [^,]* соответствует 0 символам, отличным от , , какой шаблон вы можете придумать (не забывайте о разделителях регулярных выражений, т. Е. / И / Вокруг вашего шаблона)?

3. Если ответ решил вашу проблему, подумайте о принятии ответа. Вот как meta.stackexchange.com/questions/5234 /… затем вернитесь сюда и проделайте то же самое с галочкой / галочкой, пока она не станет зеленой. Это информирует сообщество о том, что решение найдено. В противном случае другие могут подумать, что вопрос все еще открыт, и могут захотеть опубликовать (больше) ответов. Добро пожаловать в Stack!

Ответ №1:

Есть несколько способов сделать это, вот один пример, если вы пытаетесь просто избавиться от части текста между двумя запятыми:

 $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 from above:

 $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() ), который мы создаем, содержит именно то, что вы ищете, даже если регулярное выражение не особенно эффективно, если вы просматриваете много строк. Конкатенации нет, и шаблон намного менее хрупкий, чем примеры, которые я привел ранее. По сути, мы заменяем раздел от первой запятой до следующей запятой ничем, оставляя строку, которую вы ищете.