Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Чистка текста
 
 автор: TetRiska   (10.09.2013 в 22:35)   письмо автору
 
 

Всем привет. Помогите составить выражение которое приведет текст к нормальному виду. Вручную обработать 35 000 записей нереально, нужно автоматизировать.

Текст в базе:
Соответствие модели авто: ВАЗ 2121 "Нива"

Технические характеристики

•    Номенклатурный номер    П910Ш0SB1015000
•    Условное обозначение    2121-3101015-02
•    Посадочный диаметр    16
•    Рекомендуемая шина    6.95-16 175/80R16
•    Диаметр центрального отверстия D1, мм    98
•    Диаметр расположения крепежных отверстий D2, мм    139.7
•    Диаметр крепежого отверстия d, мм    15
•    Тип фаски, град./мм    60°
•    Число крепежных отверстий    5
•    Вылет ЕТ, мм    58
•    Масса, кг    9.100
•    Типоразмер    5Jx16

Должно получится:

<p>Соответствие модели авто: ВАЗ 2121 &quot;Нива&quot;</p>
<p>Технические характеристики</p>
<ul>
<li>Номенклатурный номер    П910Ш0SB1015000</li>
<li>Условное обозначение    2121-3101015-02</li>
<li>Посадочный диаметр    16</li>
<li>Рекомендуемая шина    6.95-16 175/80R16</li>
<li>Диаметр центрального отверстия D1, мм    98</li>
<li>Диаметр расположения крепежных отверстий D2, мм    139.7</li>
<li>Диаметр крепежого отверстия d, мм    15</li>
<li>Тип фаски, град./мм    60°</li>
<li>Число крепежных отверстий    5</li>
<li>Вылет ЕТ, мм    58</li>
<li>Масса, кг    9.100</li>
<li>Типоразмер    5Jx16</li>
</ul>

Спасибо.

  Ответить  
 
 автор: confirm   (11.09.2013 в 03:48)   письмо автору
 
   для: TetRiska   (10.09.2013 в 22:35)
 

Весь этот текст в базе храниться в одном поле разделенном переводом строки, или же каждая строка в своем поле?
Для первого случая (без учета параграфов, если их всегда два, то просто до формирования списка вычесть из массива первых два элемента и обрамить в параграфы):
<ul><li><?=implode('</li><li>'explode("\r\n"$text))?></li></ul>


Тоже самое и для второго случая, но уже для готового массива (выбранного ряда).

  Ответить  
 
 автор: TetRiska   (11.09.2013 в 11:21)   письмо автору
 
   для: confirm   (11.09.2013 в 03:48)
 

Да в одном поле. Параграфов может быть сколько угодно. Мне убрать еще те точки непонятные нужно.

  Ответить  
 
 автор: confirm   (11.09.2013 в 11:29)   письмо автору
 
   для: TetRiska   (11.09.2013 в 11:21)
 

Если параграфов сколько угодно, то как-то надо определиться что помещать в параграфы, а что в список. Убрать непонятную точку можно обычным str_replace.
А вообще-то нет, лучше по этим точкам и разбить на массив. Потом извлечь первый элемент массива array_shift, разбить его по переводу строки и обрамить параграфами. Надо полагать, что все что с точки начинается это и надо помещать в список? К оставшимся элементам массива trim, ну а далее объединить в список.

  Ответить  
 
 автор: TetRiska   (11.09.2013 в 13:21)   письмо автору
 
   для: confirm   (11.09.2013 в 11:29)
 

Да, все что с точки нужно в список. А как быть с параграфами тогда - первые 2 строки.

  Ответить  
 
 автор: confirm   (11.09.2013 в 14:21)   письмо автору
 
   для: TetRiska   (11.09.2013 в 13:21)
 

Ну все же просто (пишу с промежуточным выводом чтобы было видно данные на этапах):
<?
$s 
'Соответствие модели авто: ВАЗ 2121 &quot;Нива&quot; 

Технические характеристики 

•    Номенклатурный номер    П910Ш0SB1015000 
•    Условное обозначение    2121-3101015-02 
•    Посадочный диаметр    16 
•    Рекомендуемая шина    6.95-16 175/80R16 
•    Диаметр центрального отверстия D1, мм    98 
•    Диаметр расположения крепежных отверстий D2, мм    139.7 
•    Диаметр крепежого отверстия d, мм    15 
•    Тип фаски, град./мм    60° 
•    Число крепежных отверстий    5 
•    Вылет ЕТ, мм    58 
•    Масса, кг    9.100 
•    Типоразмер    5Jx16'
;

$s array_map('trim'explode('•'$s));

echo 
'<pre>';

print_r($s);

$p '<p>'.implode('</p><p>'array_map('trim'explode("\r\n"array_shift($s)))).'</p>';

print_r($s);

echo 
'</pre>';

echo 
$p.'<ul><li>'.implode('</li><li>'$s).'</li></ul>';

  Ответить  
 
 автор: TetRiska   (11.09.2013 в 16:39)   письмо автору
 
   для: confirm   (11.09.2013 в 14:21)
 

я думал будет больше кода :) спасибо
единое, что скрипт не сделал - не взял в тег абзаца "Технические характеристики", в примере идет отдельной строкой, т.е. должно быть 2 абзаца, можете исправить?

  Ответить  
 
 автор: confirm   (11.09.2013 в 18:14)   письмо автору
 
   для: TetRiska   (11.09.2013 в 16:39)
 

Почему не берет, вот результат:
<p>Соответствие модели авто: ВАЗ 2121 &quot;Нива&quot;</p><p></p><p>Технические характеристики</p>
И лишний параграф, это потому, что переводов строк не одна, а значит после разбиения на массив по переводу строки, нужно очистить массив от пустых элементов.

  Ответить  
 
 автор: TetRiska   (11.09.2013 в 20:51)   письмо автору
 
   для: confirm   (11.09.2013 в 18:14)
 

У меня вывело так:
<p>Соответствие модели авто: ВАЗ 2121 &quot;Нива&quot; 

Технические характеристики</p><ul><li>Номенклатурный номер    П910Ш0SB1015000</li><li>Условное обозначение    2121-3101015-02</li><li>Посадочный диаметр    16</li><li>Рекомендуемая шина    6.95-16 175/80R16</li><li>Диаметр центрального отверстия D1, мм    98</li><li>Диаметр расположения крепежных отверстий D2, мм    139.7</li><li>Диаметр крепежого отверстия d, мм    15</li><li>Тип фаски, град./мм    60°</li><li>Число крепежных отверстий    5</li><li>Вылет ЕТ, мм    58</li><li>Масса, кг    9.100</li><li>Типоразмер    5Jx16</li></ul>

  Ответить  
 
 автор: confirm   (11.09.2013 в 21:21)   письмо автору
 
   для: TetRiska   (11.09.2013 в 20:51)
 

Значит ваш текст имеет код перехода на строку не Win (\r\n), а Unix. Замените для explode "\r\n" на "\n", и добавьте удаление пустых элементов массива.

  Ответить  
 
 автор: TetRiska   (11.09.2013 в 23:29)   письмо автору
 
   для: confirm   (11.09.2013 в 21:21)
 

да, точно Unix, сделал так:
$p = '<p>'.implode('</p><p>', 
array_filter(array_map('trim', explode("\n", 
array_shift($s))))).'</p>';

array_filter годится для очистки от пустых элементов?

вышло так:
<p>Соответствие модели авто: ВАЗ 2121 &quot;Нива&quot;</p><p>Технические характеристики</p><ul><li>Номенклатурный номер П910Ш0SB1015000</li><li>Условное обозначение 2121-3101015-02</li><li>Посадочный диаметр 16</li><li>Рекомендуемая шина 6.95-16 175/80R16</li><li>Диаметр центрального отверстия D1, мм 98</li><li>Диаметр расположения крепежных отверстий D2, мм 139.7</li><li>Диаметр крепежого отверстия d, мм 15</li><li>Тип фаски, град./мм 60°</li><li>Число крепежных отверстий 5</li><li>Вылет ЕТ, мм 58</li><li>Масса, кг 9.100</li><li>Типоразмер 5Jx16</li></ul>

  Ответить  
 
 автор: confirm   (11.09.2013 в 23:32)   письмо автору
 
   для: TetRiska   (11.09.2013 в 23:29)
 

Можно и array_filter, но проще вычесть из массива пустые элементы функцией array_diff.

  Ответить  
 
 автор: TetRiska   (12.09.2013 в 00:57)   письмо автору
 
   для: confirm   (11.09.2013 в 23:32)
 

как то так?
$p = '<p>'.implode('</p><p>', 
array_diff(array_map('trim', explode("\n", 
array_shift($s))), array( '' ))).'</p>';

  Ответить  
 
 автор: confirm   (12.09.2013 в 00:58)   письмо автору
 
   для: TetRiska   (12.09.2013 в 00:57)
 

Да.

  Ответить  
 
 автор: TetRiska   (12.09.2013 в 02:04)   письмо автору
 
   для: confirm   (12.09.2013 в 00:58)
 

спасибо за помощь и советы, на работе попробую прогнать пару сотен строк с просмотром на экране, может еще что-то всплывет, а то черт знает что писалось в эту базу ранее :(

  Ответить  
 
 автор: TetRiska   (30.09.2013 в 17:08)   письмо автору
 
   для: confirm   (12.09.2013 в 00:58)
 

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

<p>Основні переваги &bull; Надійність та довговічність; &bull; Використання новітніх технологій; &bull; Висока продуктивність при низьких експлуатаційних витратах; &bull; Моделі серії 2Y6x8B, 2Y6x8D, 2Y8x10B, 2Y8x10D, є двоколісним статичним дорожнім котком з механічним приводом; &bull; Моделі LGS1822B, LGU2124, LGU1822, є трехвальцевими статичними дорожніми котками з повногідравлічним приводом.</p>
<p>Дана серія <strong>котків</strong> комплектується двигунами <u>Ricardo</u> (Великобританія) зробленими за ліцензією. Двигуни виробляються із застосуванням сучасних технологій та з гарантією сертифікації якості продукції; Простора і зручна кабіна оператора комплектується системою провітрювання і кондиціонування повітря (на замовлення);</p>
<p><strong><u>Технiчнi характеристики катка YTO:</u></strong></p>
<ul>
<li>Модель LGS1822B LGU2124 LGU182 2Y6x8B 2Y6x8D 2Y8x10B 2Y8x10D</li>
<li>Максимальна робоча вага, кг 22000 24000 22000 8000 8000 10000 10000</li>
<li>Мінімальна робоча вага, н/см 18000 21000 18000 6000 6000 8000 8000</li>
<li>Статичне лінійне навантаження (задній валець), н/см 920/1100 1010/1200 920/1100 295/410 295/410 410/500 410/500</li>
<li>Статичне лінійне навантаження (передній валець), н/см 400/500 450/540 400/500 177/237 177/237 230/310 230/310</li>
<li>Швидкість руху, км/год 9.6 9.6 9.6 4 4 4 4</li>
<li>Здатність долати підйом, % 20 20 20 20 20 20 20</li>
<li>Радіус розвороту, мм 6640 6780 6780 6500 6500 6500 6500</li>
<li>Колісна база, мм 3330 3350 3350 3150 3150 3150 3150</li>
<li>Дорожній просвіт, мм 473 425 425 320 320 320 320</li>
<li>Тип двигуна Дизель</li>
<li>Модель двигуна LRC6105 LRC6105 LRC6105 495AY 4BT3.9-C80 495AY 4BT3.9-C80</li>
<li>Потужність двигуна, kW/(к.с) 90 (122) 90 (122) 90 (122) 36.75 (50) 60(82) 36.75 (50) 60(82)</li>
<li>Загальні габарити (ДхШхВ), мм 6200x 2300x 2995 5724x 2300x 3079 5724x 2300x 3079 4500x 1580x 2660 4500x 1580x 2660 4500x 1580x 2660 4500x 1580x 2660</li>
</ul>[/code]
на выходе должно получится:
[code]<p>Основні переваги</p>
<ul>
<li>Надійність та довговічність;</li>
<li>Використання новітніх технологій;</li>
<li>Висока продуктивність при низьких експлуатаційних витратах;</li>
<li>Моделі серії 2Y6x8B, 2Y6x8D, 2Y8x10B, 2Y8x10D, є двоколісним статичним дорожнім котком з механічним приводом;</li>
<li>Моделі LGS1822B, LGU2124, LGU1822, є трехвальцевими статичними дорожніми котками з повногідравлічним приводом.</li>
</ul>
<p>Дана серія <strong>котків</strong> комплектується двигунами <u>Ricardo</u> (Великобританія) зробленими за ліцензією. Двигуни виробляються із застосуванням сучасних технологій та з гарантією сертифікації якості продукції. Простора і зручна кабіна оператора комплектується системою провітрювання і кондиціонування повітря (на замовлення).</p>
<p><strong><u>Технiчнi характеристики катка YTO:</u></strong></p>
<ul>
<li>Модель LGS1822B LGU2124 LGU182 2Y6x8B 2Y6x8D 2Y8x10B 2Y8x10D</li>
<li>Максимальна робоча вага, кг 22000 24000 22000 8000 8000 10000 10000</li>
<li>Мінімальна робоча вага, н/см 18000 21000 18000 6000 6000 8000 8000</li>
<li>Статичне лінійне навантаження (задній валець), н/см 920/1100 1010/1200 920/1100 295/410 295/410 410/500 410/500</li>
<li>Статичне лінійне навантаження (передній валець), н/см 400/500 450/540 400/500 177/237 177/237 230/310 230/310</li>
<li>Швидкість руху, км/год 9.6 9.6 9.6 4 4 4 4</li>
<li>Здатність долати підйом, % 20 20 20 20 20 20 20</li>
<li>Радіус розвороту, мм 6640 6780 6780 6500 6500 6500 6500</li>
<li>Колісна база, мм 3330 3350 3350 3150 3150 3150 3150</li>
<li>Дорожній просвіт, мм 473 425 425 320 320 320 320</li>
<li>Тип двигуна Дизель</li>
<li>Модель двигуна LRC6105 LRC6105 LRC6105 495AY 4BT3.9-C80 495AY 4BT3.9-C80</li>
<li>Потужність двигуна, kW/(к.с) 90 (122) 90 (122) 90 (122) 36.75 (50) 60(82) 36.75 (50) 60(82)</li>
<li>Загальні габарити (ДхШхВ), мм 6200x 2300x 2995 5724x 2300x 3079 5724x 2300x 3079 4500x 1580x 2660 4500x 1580x 2660 4500x 1580x 2660 4500x 1580x 2660</li>
</ul>


и скажите мне, такое вообще возможно скриптом обработать или вручную? :( вручную придется пару десятков тыс. пройти тогда, что нереально

  Ответить  
 
 автор: confirm   (30.09.2013 в 18:48)   письмо автору
 
   для: TetRiska   (30.09.2013 в 17:08)
 

<?
$str 
explode('</p>'$str2);
$str[0] = explode('&bull;'$str[0]);
$str array_shift($str[0]).'</p><ul><li>'.implode('</li><li>'$str[0]).'</li></ul>'.$str[1];

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования