Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Распарсить текстовый файл и сформировать HTML на его основе / 23 сообщений из 23, страница 1 из 1
13.05.2014, 07:22
    #38639357
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
Всем привет!
Направьте, пожалуйста, на путь истинный в решении такой вот задачки.

Есть текстовый файл.
Необходимо его преобразовать в правильный html код.
Т.е. все ссылки и email'ы привести к html записи, если перед строкой есть пустая строка, значит это начало параграфа... соответственно, если пустая строка после текста, то это конец параграфа, если параграф заканчивается знаками "-" или "=", то этот параграф должен быть заголовком первого уровня. Если параграф начинается с числа, то он должен стать заголовком уровня равному этому числу. А если параграф начинается со звездочки, то это немаркированный список.

Помогите пожалуйста.
...
Рейтинг: 0 / 0
13.05.2014, 07:34
    #38639360
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
Excubitor,

читайте файл(fread), ищите то что вам нужно(nl2br(),preg_replace()) и преобразовывайте в html сущности и теги.
в чем конретно проблема?
...
Рейтинг: 0 / 0
13.05.2014, 07:49
    #38639363
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
r u,
Ну тем, что, к сожалению, не все так просто...
Например строка:

Векторный резонатор: гипотеза и теории
======================================


должна стать: <h1>Векторный резонатор: гипотеза и теории</h1>

или:

## Погранслой искажает вихрь по мере распространения сигнала

должна стать: <h2>Погранслой искажает вихрь по мере распространения сигнала</h2>

Чем тут preg_replace() может помочь?

Пока что я из заданного могу только открыть файл ((
...
Рейтинг: 0 / 0
13.05.2014, 08:21
    #38639366
FatalPHPError
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
Как-то так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?php
$str = <<<EOT
Векторный резонатор: гипотеза и теории
======================================
## Погранслой искажает вихрь по мере распространения сигнала
EOT;
$str = preg_replace ('/(.*?)\n=+/m', '<h1>\1</h1>', $str);
$str = preg_replace ('/^##\s*(.*)/m', '<h2>\1</h2>', $str);
echo $str;


Результат:
Код: sql
1.
2.
<h1>Векторный резонатор: гипотеза и теории</h1>
<h2>Погранслой искажает вихрь по мере распространения сигнала</h2>
...
Рейтинг: 0 / 0
13.05.2014, 08:26
    #38639368
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
FatalPHPError,
Огромное спасибо вам! Если вам не сложно расскажите, пожалуйста, что значат регулярки /(.*?)\n=+/m и /^##\s*(.*)/m
...
Рейтинг: 0 / 0
13.05.2014, 08:42
    #38639372
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
А используя preg_replace() возможно решить остальные части задачи? Например

http://ya.ru Резонатор вращает ультрафиолетовый лазер

Должна стать: <a href=" http://ya.ru">Резонатор</a>

А вот это:
Примесь, как бы это ни казалось парадоксальным, сингулярно возбуждает
экситон, при этом дефект массы не образуется.

Гидродинамический удар квантуем. Взвесь пространственно ускоряет кварк - все дальнейшее далеко выходит за
рамки текущего исследования и не будет здесь рассматриваться.

должно стать:
<p>Примесь, как бы это ни казалось парадоксальным, сингулярно возбуждает
экситон, при этом дефект массы не образуется.</p>

<p>Гидродинамический удар квантуем. Взвесь пространственно ускоряет кварк - все дальнейшее далеко выходит за рамки текущего исследования и не будет здесь рассматриваться.</p>
...
Рейтинг: 0 / 0
13.05.2014, 09:08
    #38639394
FatalPHPError
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
Например

http://ya.ru Резонатор вращает ультрафиолетовый лазер

Должна стать: <a href=" http://ya.ru">Резонатор</a>

Код: php
1.
$str = preg_replace ('|^(https?://.+?)\s(.+)|m', '<a href="\1">\2</a>', $str);
...
Рейтинг: 0 / 0
13.05.2014, 09:39
    #38639424
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
FatalPHPError, Обалдеть... Спасибо! С удовольствием поставил бы вам пива )
Блин, как такие забубенные регулярки читать? Я привык то к простым, а сейчас пытаюсь разобраться в ваших и уже запутался во всех этих квантификаторах...
Ну подскажите пожалуйста, что это регулярное выражение значит? |^(https?://.+?)\s(.+)|m
И быть может, я уже не буду мучить других людей ((
...
Рейтинг: 0 / 0
13.05.2014, 11:51
    #38639572
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
Excubitorкак такие забубенные регулярки читать? Тынц. Много букв, но довольно подробно описано.
...
Рейтинг: 0 / 0
13.05.2014, 11:55
    #38639577
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
vkle,
Эм... я почти все это прочитал уже... от того, что я теперь понимаю большинство символов в вышестоящих регулярок меняется мало. Как ее составить? Небольшую (достаточную, чтобы пропарсить урл) я и сам могу написать, а вот те что приводятся в этой ветке сложноваты для моего понимания. Мне бы понять как ее составили, чтобы на остальные условия задачи я сам уже писал.
...
Рейтинг: 0 / 0
13.05.2014, 12:26
    #38639630
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
Excubitor,

Начните разбор с понимания каждого символа в регулярке.
Excubitorчто это регулярное выражение значит? |^(https?://.+?)\s(.+)|m
Откройте мануал и давайте читать по буквам... :-)

Здесь символ | - ограничитель регулярного выражения. Довольно часто используют слеш, но допустимы и другие символы.
^ - начало строки
Скобки выделяют часть строки, которая будет сохранена в результате и может быть использована позже.
https? - здесь часть строки "http" проверяется как есть, а вопросительный знак указывает, что символ "s" может быть, а может и не быть.
:// - это проверяется как есть
.+ - точка означает "любой символ", а плюс означает "один или более".
\s - любой пробельный символ.

Таким образом, эта часть регулярного выражения возьмет текст строго в начале строки, начинающийся на http:// или https://, за которым идут один или более каких-то символов до ближайшего пробела. Этот фрагмент текста доступен будет в выражении для замены как "\1" (можно прочитать как "первый найденный фрагмент").

После пробела идет (.+) - эта часть выражения возьмет любые один или более символов. Этот фрагмент будет вторым.

Про модификатор m прочтите уж в мануале.
...
Рейтинг: 0 / 0
13.05.2014, 12:38
    #38639646
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
vkle,
Вот спасибо огромное ))) Стало сразу все понятнее!

Жизнь стала чуть легче, а сон менее крепким..
Стало легче читать чужое... осталось научиться писать свое.

Если взять часть задачи про параграфы.

авторА вот это:
Примесь, как бы это ни казалось парадоксальным, сингулярно возбуждает
экситон, при этом дефект массы не образуется.

Гидродинамический удар квантуем. Взвесь пространственно ускоряет кварк - все дальнейшее далеко выходит за
рамки текущего исследования и не будет здесь рассматриваться.

должно стать:
<p>Примесь, как бы это ни казалось парадоксальным, сингулярно возбуждает
экситон, при этом дефект массы не образуется.</p>

<p>Гидродинамический удар квантуем. Взвесь пространственно ускоряет кварк - все дальнейшее далеко выходит за рамки текущего исследования и не будет здесь рассматриваться.</p>

регулярка должна получиться что-то вроде:

$f = preg_replace ('/\n.*\n/', '<p>\1</p>', $f);

или может даже:

$f = preg_replace ('/^(\n.*\n)/m', '<p>\1</p>', $f);
...
Рейтинг: 0 / 0
13.05.2014, 12:45
    #38639651
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
ExcubitorЕсли взять часть задачи про параграфы.
как только вы сами для себя определите четко что такое параграф - так сразу и регулярку напишите для этого.

у вас - параграф это текст перед которым есть два перевода строки или начало всего текста. так?
...
Рейтинг: 0 / 0
13.05.2014, 13:01
    #38639689
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
r u,

Мда... вы правы...
Так?

Код: php
1.
preg_replace("/^(.+)\n/m", "<p>\1</p>\n", $а);
...
Рейтинг: 0 / 0
13.05.2014, 15:40
    #38639915
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
Блин... как то она не так работает ((
...
Рейтинг: 0 / 0
13.05.2014, 17:30
    #38640092
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
Вроде, в первом посте есть определение параграфа:Excubitorесли перед строкой есть пустая строка, значит это начало параграфа... соответственно, если пустая строка после текста, то это конец параграфаТеперь определим, что такое пустая строка. Предположим, что это строка, где нет никаких символов кроме перевода строки. В простейшем случае два перевода строки подряд ("\n\n") будет пустой строкой. Не забываем про виндовый и маковский варианты, если они потенциально могут быть в тексте. Возможно, Вы захотите расширить понятие пустой строки и на строки, состоящие целиком из невидимых символов - пробелов и табуляции.
Таким образом, вероятно, в самом простейшем случае параграф можно распознать/взять приблизительно каким-то таким выражением:
Код: php
1.
|\n\n(.+)\n\n|msU
...
Рейтинг: 0 / 0
13.05.2014, 18:19
    #38640157
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
vkle,

Я думал насчет такого варианта... не получилось, не помню уже почему.
Все сделал в общем, без вас бы затянулось это на долго-долго.
В принципе, может кому то мои сегодняшние мучения пригодятся, так что выведу, что получилось.

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<html>
	<head>
	<title>Выбрать текстовый файл</title>

	</head>
	<body>
	<form name="test" method="post" action="input1.php">
		<p> <b>Введите название файла:</b><br>
			<input type="text" name="filename" size="40">
		</p>
		<p> <input type="submit" value="Отправить">
			<input type="reset" value="Очистить">
		</p>
	</body>
</html>



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
	<?php
	
		$strFileName = $_POST["filename"];
		$strFileFullName = $strFileName . '.txt';
		
        $f = file_get_contents($strFileFullName); 
		$contents = $f;

			$contents = preg_replace ('/(.*?)\n=+/m', '<h1>\1</h1>', $contents);//делаем заголовок первого уровня
			$contents = preg_replace ('/(.*?)\n-+/m', '<h1>\1</h1>', $contents);//делаем заголовок первого уровня
			$contents = preg_replace ('/^##\s*(.*)/m', '<h2>\1</h2>', $contents);//делаем заголовок второго уровня
			$contents = preg_replace ('|(https?://.+?)\s(.+?)\s|m', '<a href="\1">\2</a>&nbsp;', $contents);//меняем ссылки
			$contents = preg_replace ('|\.(.+)\@(.+?)\s(.+?)\s|m', '&nbsp;<a href="mailto:\1@\2">\3</a>&nbsp;',$contents);//меняем email
			$contents = preg_replace ("/\n/m", "&nbsp;", $contents);//удаляем переносы строки 
			$contents = preg_replace ("/&nbsp;&nbsp;/m", "\n", $contents);//меняем два пробела на перенос
			$contents = preg_replace ("/^(.+)\n/m", "<p>$1</p>\n", $contents);//устанавливаем параграфы
			$contents = preg_replace ("/\*(.+)\n/m", "<ul>*$1</ul>", $contents);//начинаем список
			$contents = preg_replace ("/\*(.+?)&nbsp;/m", "<li>$1</li>", $contents);//заканчиваем список
			$contents = preg_replace ("/\*(.+)\n/m", "<li>$1</li>", $contents);//заканчиваем список

			
			echo $contents;
		
	?>



конечно косяков хватает, но я, буквально сегодня с регулярными выражениями познакомился, так что извиняйте. Спасибо всем за помощь. Хотя завтра наверное придется до ума доводить... а именно, чтобы работало под любым текстовым документом, а то иногда все таки приколы случаются (
...
Рейтинг: 0 / 0
13.05.2014, 18:31
    #38640170
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
Excubitor,

Думаю, можно чуток соптимизировать код:
http://ru2.php.net/manual/ru/function.preg-replace.php Если и pattern и replacement являются массивами , каждый элемент pattern будет заменен соответствующим элементом из replacement.
...
Рейтинг: 0 / 0
13.05.2014, 19:03
    #38640202
nscl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
Насколько я понял, пишется скрипт для наведения порядка в старых залежах научных статей, созданных ещё во времена весьма доисторические, в формате *.txt и в старых кодировках.

Применять php имеет смысл в том случае, если вы хотите добавить такой "умный конвертор" к уже существующему веб-сайту. Если же вы планируете массовую обработку - я очень советую посмотреть в сторону написания скрипта для SED или AWK. Те же регулярки, но гораздо большее удобство при массированном применении и обработке файловых хранилищ.

Стопроцентно работать для всех файлов оно не будет - если файл текстовый, и разукрашивался вручную такой вот типа псевдографикой - все случаи не охватите, можно будет лишь снизить объем ручной работы.
...
Рейтинг: 0 / 0
13.05.2014, 19:18
    #38640214
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
vkleExcubitor,

Думаю, можно чуток соптимизировать код:
http://ru2.php.net/manual/ru/function.preg-replace.php Если и pattern и replacement являются массивами , каждый элемент pattern будет заменен соответствующим элементом из replacement.

Хах... точно ) Спасибо! Завтра займусь. Ваша помощь неоценима )
...
Рейтинг: 0 / 0
13.05.2014, 19:21
    #38640218
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
nscl,
Спасибо за совет, но нет. Я просто прочитал задание и меня заинтересовало попробовать его сделать. Но если вдруг мне понадобится подобный конвертер - воспользуюсь вашим советом )
...
Рейтинг: 0 / 0
14.05.2014, 03:39
    #38640459
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
Как то надо переделать парсер email'a ((
Дело в том, что в таком состоянии

Код: php
1.
$contents = preg_replace ('|\.(.+)\@(.+?)\s(.+?)\s|m', '&nbsp;<a href="mailto:\1@\2">\3</a>&nbsp;',$contents);//меняем email



Он начинает искать майл, если перед ним точка стоит (писал, чтобы проверить на одном файле, соответственно открыв другой, емайла он там не нашел) ((
Пробовал, чтобы он пытался с пробела (использовал и \s, и \040, и  ) все равно начинает парсить откуда-то с другого места, обычно за несколько слов до начала емайла)

Смысл в том, чтобы парсер находил емайл в любой части документа.
Не подскажите, что я упускаю?
...
Рейтинг: 0 / 0
14.05.2014, 07:42
    #38640485
Excubitor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить текстовый файл и сформировать HTML на его основе
Ммм... что такое вот должно сработать, наверное:

Код: php
1.
[-\w_]+@[-\w]+\.\w+/i
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Распарсить текстовый файл и сформировать HTML на его основе / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]