Эквивалент регулярного выражения Mysql для этого шаблона:
<table (.+)width:(.+)px
Я попытался поместить этот шаблон в свой запрос, но он все равно будет попадать в элементы, которые не имеют шаблона.
Я использую этот сайт, чтобы проверить, соответствует ли элемент приведенному выше шаблону: https://regex101.com/
Это мой запрос:
select * from wp_posts where post_content regexp '<table (.+)width:(.+)px';
Это мой правильный пример post_content:
<table class = "table-schedule" style = "width: 737px;">
<tbody>
<tr>
<th>営業時間</th>
<th>月</th>
<th>火</th>
<th>水</th>
<th>木</th>
<th>金</th>
<th class = "holiday">土</th>
<th class = "holiday">日</th>
<th class = "holiday">祝</th>
</tr>
<tr>
<td>11:00~19:00</td>
<td class = "weekday maru">○</td>
<td class = "weekday maru">休</td>
<td class = "weekday maru">○</td>
<td class = "weekday maru">○</td>
<td class = "weekday maru">○</td>
<td class = "holiday">○</td>
<td class = "holiday">○</td>
<td class = "holiday">○</td>
</tr>
</tbody>
</table>
Это другой образец post_content, который неверен. Это все равно сработает, даже если на столе нет ширины:
<table class = "table-schedule">
<tbody>
<tr>
<th>営業時間</th>
<th>月</th>
<th>火</th>
<th>水</th>
<th>木</th>
<th>金</th>
<th class = "holiday">土</th>
<th class = "holiday">日</th>
<th class = "holiday">祝</th>
</tr>
<tr>
<td style = "text-align: center;">
<p>11:00~19:00</p>
</td>
<td class = "weekday maru" style = "text-align: center;">○</td>
<td class = "weekday maru" style = "text-align: center;">休</td>
<td class = "weekday maru" style = "text-align: center;">○</td>
<td class = "weekday maru" style = "text-align: center;">休</td>
<td class = "weekday maru" style = "text-align: center;">○</td>
<td class = "holiday" style = "text-align: center;">休</td>
<td class = "holiday" style = "text-align: center;">休</td>
<td class = "holiday" style = "text-align: center;">休</td>
</tr>
<tr>
<td style = "text-align: center;">
<p>11:00~17:00</p>
</td>
<td style = "text-align: center;">休</td>
<td style = "text-align: center;">○</td>
<td style = "text-align: center;">休</td>
<td style = "text-align: center;">○</td>
<td style = "text-align: center;">休</td>
<td style = "text-align: center;">○</td>
<td style = "text-align: center;">休</td>
<td style = "text-align: center;">休</td>
</tr>
</tbody>
</table>
Примечание: версия mysql 5.6.
Есть ли где-нибудь в содержании поста ширина для тех, которым вы не хотите соответствовать? Я думаю, вы хотели бы разрешить любой символ, кроме закрывающих тегов HTML в вашем регулярном выражении, чтобы убедиться, что ширина является атрибутом элемента таблицы - <table ([^>]*)width:([^>]+)px
У меня это работает здесь: db-fiddle.com/f/uMB8Vufv66SLGjQmmrbjf2/1 Мне пришлось удалить все символы, отличные от ASCII, потому что я не мог понять, как заставить скрипт DB принимать их.
Хотя ваш текущий шаблон регулярного выражения действителен, он не будет вести себя так, как вы хотите, потому что термины (.+)
могут совпадать в тегах. Попробуйте эту версию:
SELECT *
FROM wp_posts
WHERE post_content REGEXP '<table [^>]+width: [0-9]+px';
Его проблема в том, что это совпадающие строки, в которых вообще нет width
. Так что, хотя это действительное улучшение, оно, похоже, не связано с проблемой.
Тогда наше понимание проблемы разнится.
Он написал Это все равно сработает, даже если на столе нет ширины:. Посмотрите на второй пример.
@Barmar MySQL's REGEXP
по умолчанию работает в режиме DOT ALL.
Похоже, они исправили это в 8.0, вам нужно использовать модификатор (?m)
.
Но это все еще не объясняет, почему второй пример соответствует, поскольку нигде не имеет width
. Если он не опубликовал неправильный пример.
@Barmar Теперь я понимаю твою точку зрения. Я предполагал, что ниже по течению во втором тексте был случайный атрибут width=
, нет часть самого тега <table>
. Может быть, я ошибаюсь.
Или, может быть, вы правы, и он слишком упростил примеры.
И, конечно, возможно, что в его таблице есть другие случаи, когда это исправление необходимо, если не тот, который он показал.
Это регулярное выражение должно нормально работать в MySQL.