Несколько совпадений с регулярным выражением не возвращаются - PullRequest
1 голос
/ 26 февраля 2020

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

Это то, что я помещаю в редактор.

<tr _excel-dimensions='{"row":{"rowHeight":50}}'>
<td _excel-styles='{"font":{"size":20,"color":{"rgb":"333333"},"bold":true},"fill":{"fillType":"solid","startColor":"F0F0F0"},"alignment":{"horizontal":"center"}}' colspan='6'>Affiliate Accounts</td>
</tr>

и это что делает редактор после сохранения

<tr _excel-dimensions="{&quot;row&quot;:{&quot;rowHeight&quot;:50}}">
<td _excel-styles="{&quot;font&quot;:{&quot;size&quot;:20,&quot;color&quot;:{&quot;rgb&quot;:&quot;333333&quot;},&quot;bold&quot;:true},&quot;fill&quot;:{&quot;fillType&quot;:&quot;solid&quot;,&quot;startColor&quot;:&quot;F0F0F0&quot;},&quot;alignment&quot;:{&quot;horizontal&quot;:&quot;center&quot;}}" colspan="6">Accounts</td>
</tr>

Кажется, нет способа переопределить настройку в TinyMCE. Поэтому я обращаюсь к RegEx с PHP при сохранении данных в базе данных. Это то, что у меня пока есть, но, похоже, он не захватывает все двойные кавычки.

$content = preg_replace_callback('/<(.*)(\")(.*)(\")(.*)>/miU', function($matches) {
  return "<" . $matches[1] . "'" . html_entity_decode($matches[3]) . "'" . $matches[5] . ">";
}, $content);

Он заменяет кодированную строку json, но не colspan = "6"

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 27 февраля 2020

Как я уже сказал в комментарии, разбирать HTML с регулярным выражением не очень хорошо, лучше использовать специальные библиотеки, такие как PHP Simple HTML DOM Parser . Однако возможно построить регулярное выражение, которое будет работать с правильным HTML.

Наша цель - найти все строки в двойных кавычках внутри тега. Сначала давайте забудем о требовании, чтобы строка в двойных кавычках была внутри тега. Тогда мы можем использовать это:

$content = preg_replace_callback('/"(.*?)"/', 
  function($matches) {
    return "'" . html_entity_decode($matches[1]) . "'" 
  }, 
  $content);

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

  • там должно быть закрытие тега >. Это означает, что должна быть некоторая последовательность не <, не > символов, за которыми следует >. Соответствующее регулярное выражение - [^<>]*>
  • , за которым должно следовать любое количество полных тегов < и >. Регулярное выражение для группы символов, содержащей один тег: [^<]*<[^>]*>. Нам нужно повторять эту группу любое количество раз: (?:[^<]*<[^>]*>)*
  • до конца текста могут быть некоторые символы не <, не >: [^<>]*$

Результирующее выражение выглядит немного страшно, но делает работу: (?=[^<>]*>(?:[^<]*<[^>]*>)*[^<>]*$).

Наконец, мы включаем эту проверку в исходное регулярное выражение:

$content = preg_replace_callback('/"(?=[^<>]*>(?:[^<]*<[^>]*>)*[^<>]*$)(.*?)"/', 
  function($matches) {
    return "'" . html_entity_decode($matches[1]) . "'" 
  }, 
  $content);

Вы можете проверить это здесь: Regex101 demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...