Intereting Posts
Правильно использовать классы в других классах в php? как придерживаться принципа Don't-Repeat-Yourself (DRY), когда будет слишком много if-then-else, делая код нечитаемым? Mcrypt не обнаружен при установке Laravel Объединить значения n массивов в php Сортировка анкетных данных с использованием PHP и SQL Обновление моей библиотеки шифрования от Mcrypt до OpenSSL Как вставить теги ссылок между тегами заголовка в HTML с помощью SimpleHtmlDom Ошибка Paypal PDT 4003 Класс DomDocument не может получить доступ к domnode Лучший способ совместного использования пользовательского кода PHP среди проектов Ошибка «Невозможно убить процесс» с помощью «php composer.phar install» на Azure SQLSTATE : Общая ошибка: 1366 Неправильное целочисленное значение: любое решение? В PHP: OpenSSL Сообщения об ошибках: ошибка: 1409F07F: Подпрограммы SSL: SSL3_WRITE_PENDING: неудачная попытка записи Обнаружение недостаточных переменных PHP: FALSE vs NULL vs unset () vs empty ()? Скрыть информацию о входе в базу данных в PHP Code

Мне нужна помощь в изменении регулярного выражения для уценки PHP

Я изменяю PHP Markdown (парсер PHP языка разметки, который используется здесь в Stack Overflow), пытающийся реализовать пункты 1, 2 и 3, описанные Джеффом в этом сообщении блога . Я легко сделал последние два, но это очень сложно:

  1. Убрана поддержка акцента внутри слова как_this_example

Фактически, в «нормальной» уценке реализация like_this_example будет отображаться как в этом примере. Это очень нежелательно; Я хочу, чтобы в качестве примера был только _пример.

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

var $em_relist = array( '' => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S|$)(?![.,:;]\s)', '*' => '(?<=\S|^)(?<!\*)\*(?!\*)', '_' => '(?<=\S|^)(?<!_)_(?!_)', ); var $strong_relist = array( '' => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S|$)(?![.,:;]\s)', '**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)', '__' => '(?<=\S|^)(?<!_)__(?!_)', ); var $em_strong_relist = array( '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S|$)(?![.,:;]\s)', '***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)', '___' => '(?<=\S|^)(?<!_)___(?!_)', ); 

Я попытался открыть его в Regex Buddy, но этого было недостаточно, и, проведя полчаса, я все еще не знаю, с чего начать. Какие-либо предложения?

Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них есть две проблемы.

Я смог захватить только отдельные слова с _enclosed_ через:

 $input = 'test of _this_ vs stuff_like_this...and here is _anothermatch_ and_another_fake_string'; $pattern = '#(?<=\s|^)(?<!_)(_[^_]*_)(?!_)#is'; preg_match_all($pattern, $input, $matches); print_r($matches); 

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

 $pattern = '#(?<=\s|^)(?<!_)(__[^_]*__)(?!_)#is'; $pattern = '#(?<=\s|^)(?<!_)(___[^_]*___)(?!_)#is'; 

Я тоже использую RegexBuddy. 🙂

Вы можете попробовать следующий код:

 <?php $line1 = "like_this_example"; $line2 = "I want only _example_ to become example"; $pattern = '/\b_(?P<word>.*?)_\b/si'; if (preg_match($pattern, $line1, $matches)) { $result = $matches['word']; var_dump($result); } if (preg_match($pattern, $line2, $matches)) { $result = $matches['word']; var_dump($result); } ?>