Intereting Posts
все равно, чтобы определить публичные или частные или защищенные классы в PHP WordPress: добавьте дополнительную плату в корзину PHP – не удалось открыть поток: нет такого файла или каталога в Как вставить входной массив html в mysql, используя PDO Уникально идентифицировать один компьютер Войдите в систему с помощью curl и перейдите на другую страницу PHP сортирует массив массивов в соответствии с индексом в массивах Как подсчитать дни между двумя датами в PHP? Сравнение ближайших строк PHP PDO связывает n раз такое же значение с foreach Regex http / www для ссылок Каков наилучший способ взглянуть на экземпляр (объект) класса PHP, чтобы увидеть все доступные ему публичные свойства и методы? Реализация функции хеширования MySQL Создайте инструкцию Insert … Select в Laravel Показывать данные на основе выбранного идентификатора в модальном всплывающем окне после нажатия кнопки php mysql

regex, чтобы найти строку в квадратных скобках

Я хочу захватить текст в квадратных скобках в строке html ниже. Но регулярное выражение, которое у меня ниже, не получает изображения «image» и «imagealt» отдельно, а возвращает «изображение» вместо «alt =» [imagealt]. Если я вытащу alt = "[imagealt]" из строки, она вернется, как я ожидал / хочу.

$html = '<h2>[title]</h2> <div class="content"><img src="[image]" alt="[imagealt]" /></div> <div class="content">[text]</div>'; preg_match_all("^\[(.*)\]^",$html,$fields, PREG_PATTERN_ORDER); echo "<pre>"; print_r($fields); echo "</pre>"; Array ( [0] => Array ( [0] => [title] [1] => [image]" alt="[imagealt] [2] => [text] ) [1] => Array ( [0] => title [1] => image]" alt="[imagealt [2] => text ) ) 

ваше регулярное выражение жадно. вам нужно остановить его, чтобы быть жадным, чтобы делать то, что вы хотите. Узнайте здесь немного о жадности.

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

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

 preg_match_all("^\[(.*?)\]^",$html,$fields, PREG_PATTERN_ORDER); 
 preg_match_all("#\[[^\]]*\]#",$html,$fields, PREG_PATTERN_ORDER); 

Шаблон ^ используется для отметки начала строки, поэтому я использую # или | для разделителя, чтобы избежать путаницы. Кроме того, я использую [^\]*] вместо .*? потому что он обязательно остановится, как только он достигнет конца ] , тогда как вам нужен ленивый модификатор . и, возможно, даже модификатор m , чтобы гарантировать, что он захватывает разрывы строк, если ваши атрибуты решили включить их.

использование

  preg_match_all("^\[(.*?)\]^",$html,$fields, PREG_PATTERN_ORDER); 

Дополнительно ? означает «не жадный матч», он остановится после того, как будет найдено ]