Я пытаюсь сделать блок html, вычеркнуть все html-теги и поместить каждую строку текста в массив PHP.
Я просто пытаюсь использовать один блок для проверки (следовательно, WHERE ID = '2409'
в моем запросе mysql.
Часть HTML для ID
2409
выглядит так:
<table class="description-table"> <tbody> <tr><td>Saepe Encomia 2.aD NEC Mirum Populo Soluni Iis 8679-1370 Status Error Sed 9.9</td></tr> <tr><td>Description</td></tr> <tr><td></td> <td><br> <br><p></p><p></p> <strong><br></strong> <strong><br></strong> <strong>Donec Rem </strong><br> <br> <strong>Animam Urgebat<br> <br></strong> <strong><br> <br> Rerum Sed 8613 - 3669 8358 & 6699<br> <br> 1.mE (magNA) QUO Ad Nominum Statum Massa<br> ab SEM Autem Reddet Habitu Sit<br> <br></strong> <strong> PRAEDAM ACCUMSAN PERSONARUM DENEGARE AC DUORUM</strong> <strong><br></strong> <strong><br></strong> <strong>Lius typi sit nec quo adversis cras ministri oppressa, versus class hic rem quos colubros ullo commune!economy!</strong><strong><br></strong><strong> ad Quisque Modeste</strong><strong> ac Rem Wisi</strong><strong> ex Hac Congue mus Leo</strong><strong> ab 7/92" Alias</strong><strong> ad 2/73" Adverso & Erat</strong><strong> me Personom Eget</strong><strong> ad Viribus Fuga Fuga</strong><strong> ab Louor-Sit Molles</strong><strong class="c2"> 3x Block-Off Plates</strong><strong class="c2"> ad Facunda</strong><strong class="c2"> ab Personas Diam<br> NUNC<br> ex Teniet te Palmam Eaque<br> me Teniet in Versus Urna<br></strong> <strong><br></strong><br> <strong class="c3">**CONDEMNENDUS REM CUM MAGNORUM**</strong><strong></strong><br> </td> </table>
И вот мой PHP-скрипт, предназначенный для анализа этого
//connect to mysqli $results = $mysqli->query("SELECT ID, post_content FROM wp_posts' WHERE ID = '2409';"); while($row = $results->fetch_array()) { $htmlarray2 = preg_split('/<.+?>/', $row['post_content']); $htmlarray = array_values(array_filter(array_map('trim', $htmlarray2))); echo '<pre>'; print_r($htmlarray); echo '</pre>'; . . . }
Это дает такой результат
Array ( [0] => Saepe Encomia 2.aD NEC Mirum Populo Soluni Iis 8679-1370 Status Error Sed 9.9 [1] => Donec Rem [2] => Animam Urgebat [3] => Rerum Sed 8613 - 3669 8358 & 6699 [4] => 1.mE (magNA) QUO Ad Nominum Statum Massa [5] => ab SEM Autem Reddet Habitu Sit [6] => PRAEDAM ACCUMSAN PERSONARUM DENEGARE AC DUORUM [7] => Lius typi sit nec quo adversis cras ministri oppressa, versus class hic rem quos colubros ullo commune! [8] => ad Quisque Modeste [9] => ac Rem Wisi [10] => ex Hac Congue mus Leo [11] => ab 7/92" Alias [12] => ad 2/73" Adverso & Erat [13] => me Personom Eget [14] => ad Viribus Fuga Fuga [15] => ea Totam Poenam [16] => ab Louor-Sit Molles [17] => ad Facunda [18] => ab Personas Diam [19] => NUNC [20] => ex Teniet te Palmam Eaque [21] => me Teniet in Versus Urna [22] => **CONDEMNENDUS REM CUM MAGNORUM** )
Это нормально, но теперь у меня проблема с удалением пробелов до и после строк в массиве.
Возьмем пример для узла 8
в массиве
. . . $arrayvalue = $htmlarray2['8'];
который повторяет это
ad Quisque Modeste
Теперь то, что я пытаюсь сделать, очевидно, обрезает каждый элемент массива, но для тестирования я просто работаю с этой переменной $arrayvalue
.
Моя проблема в том, что trim()
не работает с этой переменной, полученной MySQL. Значение добавления trim($arrayvalue);
не влияет и отгоняет то же, что и выше.
Я знаю, что это связано с тем, что я получаю массив по моему запросу, потому что, если я просто проверю эту переменную как обычно в своем собственном сценарии php
$string = ' ad Quisque Modeste '; echo trim($string);
Он отлично работает, а ad Quisque Modeste
просто представляют собой ad Quisque Modeste
с желаемыми белыми пробелами до или после строки.
Почему trim()
работает в моем цикле while? Каков трюк для обрезки ведущих и задних белых пространств из элементов?
Изменить: Вот мой полный цикл while по запросу. Это немного отличается от приведенного выше примера (я делал много изменений, пытаясь решить это сам, поэтому он постоянно меняется), но вот что я имею сейчас:
while($row = $results->fetch_array()) { $id = $row['ID']; echo 'ID: ' . $id; echo '<br />'; //replace with white space $converted = strtr($row['post_content'],array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES))); trim($converted, chr(0xC2).chr(0xA0)); //remove html elements $htmlarray = preg_split('/<.+?>/', $converted); // remove empty array elements and re-index array $htmlarray2 = array_values(array_filter(array_map('trim', $htmlarray))); // test by getting single value from array $arrayvalue = $htmlarray2['9']; // my attempt to trim string in while loop trim($arrayvalue); // doesn't trim echo '<hr>' . $arrayvalue . '<hr>'; // put this here so I can see the full array echo '<pre>'; print_r($htmlarray2); echo '</pre>'; }
В соответствии с запросом, вот результаты var_export($row['post_content']);
'<table class="product-description-table"> <tbody> <tr> <td class="item" colspan="3">Saepe Encomia 2.aD NEC Mirum Populo Soluni Iis 8679-1370 Status Error Sed 9.9</td> </tr> <tr> <td class="title" colspan="3"></td> </tr> <tr> <td class="content"><br> <br> <p class="c1"></p> <p class="c1"></p> <strong><br></strong> <strong><br></strong> <strong>Donec Rem </strong><br> <br> <strong>Animam Urgebat<br> <br></strong> <strong><br> <br> Rerum Sed 8613 - 3669 8358 & 6699<br> <br> 1.mE (magNA) QUO Ad Nominum Statum Massa<br> ab SEM Autem Reddet Habitu Sit<br> <br></strong> <strong> PRAEDAM ACCUMSAN PERSONARUM DENEGARE AC DUORUM</strong> <strong><br></strong> <strong><br></strong> <strong>Lius typi sit nec quo adversis cras ministri oppressa, versus class hic rem quos colubros ullo commune!economy!</strong><strong><br></strong><strong> ad Quisque Modeste</strong><strong> ac Rem Wisi</strong><strong> ex Hac Congue mus Leo</strong><strong> ab 7/92" Alias</strong><strong> ad 2/73" Adverso & Erat</strong><strong> me Personom Eget</strong><strong> ad Viribus Fuga Fuga</strong><strong> ab Louor-Sit Molles</strong><strong class="c2"> 3x Block-Off Plates</strong><strong class="c2"> ad Facunda</strong><strong class="c2"> ab Personas Diam<br> NUNC<br> ex Teniet te Palmam Eaque<br> me Teniet in Versus Urna<br></strong> <strong><br></strong><br> <strong class="c3">**CONDEMNENDUS REM CUM MAGNORUM**</strong><strong> </strong><br></td> <td class="product-content-border"></td> </tr> <tr> <td class="gallery" colspan="3"> <table> <tbody> <tr> <td></td> <td></td> </tr> <tr> <td></td> <td></td> </tr> <tr> <td></td> <td></td> </tr> <tr> <td></td> <td></td> </tr> <tr> <td></td> <td></td> </tr> <tr> <td></td> <td></td> </tr> <tr> <td></td> <td></td> </tr> <tr> <td></td> <td></td> </tr> </tbody> </table> </td> </tr> <tr> <td></td> </tr> <tr> <td class="spacer" colspan="3"></td> </tr> <tr> <td class="product-content-border"></td> </tr> </tbody> </table> <br> <br> <br> <p class="c4"></p>'
Final Edit :):
Добавлено решение ниже. Не собираюсь принимать мой собственный ответ.
Если кто-нибудь, знакомый с регулярным выражением, может помочь объяснить всю скорбь за всем этим и почему эта формула регулярного выражения: /[\s]+/mu
или скорее $clean_htmlarray = preg_replace('/[\s]+/mu', ' ', $htmlarray);
исправленный этот вопрос, я с радостью соглашусь с ним в качестве правильного ответа и объяснения.
Вот ваше запрошенное объяснение в шаблоне регулярных выражений, которое решило вашу проблему:
/[\s]+/
говорит: «Ищите один или несколько символов пробела (это включает в себя: '', '\ r', '\ n', '\ t', '\ f', '\ v') . multi-line
модификатор / флаг не нужен, потому что вы не используете привязки ( ^
$
) в своем шаблоне. Модификатор / флаг unicode
абсолютно критичен в вашем случае, потому что ваша строка html-текста содержит много маленьких дьяволов, которые называются …
«NO-BREAK SPACE» и представляет собой комбинацию символов юникода
194
и160
представленных как\x{00A0}
См.\x{00A0}
здесь .
Без флага u
символы NO-BREAK SPACE
остаются, и для их удаления потребуется дополнительная фильтрация.
В то время как вы в конечном итоге получили свой код на правильном выходе. Я рад создать более компактный одноэтапный шаблон, который поможет вам быстрее, используя preg_split () .
while($row=$results->fetch_array()){ $texts=preg_split('/\s*<[^>]+>\s*/u',$row['post_content'],null,PREG_SPLIT_NO_EMPTY); var_export($texts); }
вwhile($row=$results->fetch_array()){ $texts=preg_split('/\s*<[^>]+>\s*/u',$row['post_content'],null,PREG_SPLIT_NO_EMPTY); var_export($texts); }
конечныеwhile($row=$results->fetch_array()){ $texts=preg_split('/\s*<[^>]+>\s*/u',$row['post_content'],null,PREG_SPLIT_NO_EMPTY); var_export($texts); }
Вот рабочая демонстрация .
Этот новый шаблон разделения по-прежнему ищет ваши теги, но он более эффективен, потому что между <
и >
я просто прошу сопоставить все символы, которые «не», с помощью [^>]+
. Это намного проще для движка и требует совпадения с длинным списком символов .
представляет.
Кроме того, я включил в себя сопоставление для ваших белых символов пробега в кодировке unicode. \s*
будет соответствовать нулевым или более символам пробела до И после каждого тега.
Наконец, я должен объяснить дополнительные параметры на preg_split()
. Значение null
говорит «найти неограниченное количество совпадений» – это поведение по умолчанию, но я должен использовать значение null
или -1
чтобы сохранить его место, чтобы гарантировать, что используется последний параметр. PREG_SPLIT_NO_EMPTY
избавляет вас от необходимости использовать дополнительный шаг с помощью array_filter()
позже. Он опускает любые пустые элементы, сгенерированные из раскола, поэтому вы получаете только хороший материал.
Надеюсь, вы нашли это полезным / образовательным. Удачи с вашим проектом.
Обрезка не работает. Вы хотите это:
$arrayvalue = trim($arrayvalue);
Это действительно так. Trim возвращает обрезанную строку: она не изменяет переменную на месте.
Я нашел решение.
Не совсем точно, как это работает. Я не знаком с регулярным выражением.
Но решение, которое я нашел (и, может быть, кто-нибудь может это объяснить?), Было
$clean_htmlarray = preg_replace('/[\s]+/mu', ' ', $htmlarray);
Весь скрипт (за исключением материала MySQL), который работал, был
$converted = html_entity_decode( $row['post_content'], ENT_QUOTES); $converted = trim($converted, chr(0xC2).chr(0xA0)); $htmlarray = preg_split('/<.+?>/', $converted); $clean_htmlarray = preg_replace('/[\s]+/mu', ' ', $htmlarray); $htmlarray2 = array_filter(array_map('trim', $clean_htmlarray)); $clean_htmlarray2 = array_values($htmlarray2); echo '<pre>'; print_r($clean_htmlarray2); echo '</pre>';
Выход
Array ( [0] => Saepe Encomia 2.aD NEC Mirum Populo Soluni Iis 8679-1370 Status Error Sed 9.9 [1] => Description [2] => Donec Rem [3] => Animam Urgebat [4] => Rerum Sed 8613 - 3669 8358 & 6699 [5] => 1.mE (magNA) QUO Ad Nominum Statum Massa [6] => ab SEM Autem Reddet Habitu Sit [7] => PRAEDAM ACCUMSAN PERSONARUM DENEGARE AC DUORUM [8] => Lius typi sit nec quo adversis cras ministri oppressa, versus class hic rem quos colubros ullo commune!economy! [9] => ad Quisque Modeste [10] => ac Rem Wisi [11] => ex Hac Congue mus Leo [12] => ab 7/92" Alias [13] => ad 2/73" Adverso & Erat [14] => me Personom Eget [15] => ad Viribus Fuga Fuga [16] => ab Louor-Sit Molles [17] => 3x Block-Off Plates [18] => ad Facunda [19] => ab Personas Diam [20] => NUNC [21] => ex Teniet te Palmam Eaque [22] => me Teniet in Versus Urna [23] => **CONDEMNENDUS REM CUM MAGNORUM** )
Полностью обрезанный массив.
Это также работает в моем цикле while для всех строк, то есть:
$results = $mysqli->query("SELECT ID, post_content FROM wp_posts' LIMIT 50;");
В этом случае я получаю все 50 строк с полностью обрезанными строками.
Итак, наконец … это был вызов выяснить!
Я просто хочу, чтобы я понял это больше. Я действительно не чувствую, что заслуживаю подтверждения в качестве ответа на этот вопрос, поскольку все, что я действительно делал, это попробовать BUNCH разных вещей, и, наконец, это сработало.
Если кто-то хочет перезвонить и объяснить, почему $clean_htmlarray = preg_replace('/[\s]+/mu', ' ', $htmlarray);
или, скорее, /[\s]+/mu
что мне было нужно в этом случае, я с радостью отдам им ответ 🙂
На данный момент просто рад, что он работает правильно. Спасибо всем за помощь и вклад!