Intereting Posts
PHPMailer, сохранить 1 SMTP-соединение с другим получателем по контенту электронной почты PHP ouput записывается в файл в нечитаемом формате Ошибка BigCommerce OAuth «Недопустимая область действия» Инструмент поможет мне получить все css и javascript, связанные с тегом HTML Загрузка изображения Laravel AJAX Предупреждение: mysql_query () : доступ запрещен для пользователя «ODBC» @ «localhost» (с использованием пароля: НЕТ) Имитировать конструкцию языка php-массива или проанализировать с помощью регулярного выражения? Что делает E_STRICT? Двойная загрузка / сохранение объектов в OOPHP – ненужное дублирование? Как разрешить выделение жирным шрифтом, подчеркивание и курсив в текстовой области PHP foreach loop принимает элементы массива из числового порядка? Преобразователи файлов. Как они работают? Требуется расширение Mcrypt PHP. В Laravel С Ubuntu 14 Является ли хорошей практикой инициализировать элементы в ассоциативном массиве в php? Doctrine не обновляет поле типа простого массива

Trim не работает с массивом из MySQL, извлеченной из строки

Я пытаюсь сделать блок 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 &nbsp; 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&nbsp;</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>&nbsp;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>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ad Quisque Modeste</strong><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ac Rem Wisi</strong><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ex Hac Congue mus Leo</strong><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ab 7/92" Alias</strong><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ad 2/73" Adverso & Erat</strong><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;me Personom Eget</strong><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ad Viribus Fuga Fuga</strong><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ab Louor-Sit Molles</strong><strong class="c2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3x Block-Off Plates</strong><strong class="c2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ad Facunda</strong><strong class="c2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;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>&nbsp;</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 что мне было нужно в этом случае, я с радостью отдам им ответ 🙂

На данный момент просто рад, что он работает правильно. Спасибо всем за помощь и вклад!