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