 
			
				11.10.2016, 13:01
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 08.03.2015 
					
					
					
						Сообщений: 78
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		laimas,
 
Да, не работает...
 
Ваша функция работает отлично, но, я как понял, мы вначале расставляем тег br везде, а потом вырезаем их из тега pre?
 
Я это реализовал ещё месяц назад, таким образом:
 
// Расставляем в конце каждой строки тег <br>
$content = preg_replace( '/\r?\n/miu', "<br>\r\n", $content );
// Убираем все теги <br>, которые идут после открывающего тега <div>
$content = preg_replace( '/((\<div[^\>]*?\>)<br>)/miu', "$2", $content );
// Убираем все теги <br>, которые идут после тега <hr>
$content = preg_replace( '/((\<hr[^\>]*?\>)\<br\>)/miu', "$2", $content );
// Убираем все теги <br>, которые находятся внутри контейнера <pre>...</pre>
$content = preg_replace_callback(
  '/\<pre[^\>]*?\>([\s\S]*?)\<\/pre\>/miu',
  function( $matches ) {
    return preg_replace( '/\<br\>/miu', '', $matches[0] );
  },
  $content
);
// Если пустых строк с тегом <br>, больше чем 1 подряд, убираем лишние и оставляем только одну
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
Кстати, оцените эту красоту.
 
Просто уже месяц я думаю над вопросом, как сделать аналог как в CSS .content :not(pre):not(div) на PHP.
 
Эта всё, чтобы сделать автоматически расстановку параграфов в контенте, понимаете? Ведь WordPress как-то расставляет их сам. Вот я и пишу лёгкий и простой аналог парсера для людей. Совершенно бесплатно.  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				11.10.2016, 13:13
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.01.2015 
					
					
					
						Сообщений: 12,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от snovapavel
			
		
	 | 
 
	
		// Расставляем в конце каждой строки тег <br> 
$content = preg_replace( '/\r?\n/miu', "<br>\r\n", $content );
	 | 
 
	
 
 И зря. Запомните следующее - разбор рег. выражением, это затратные операции, и там где можно обойтись вполне без них, забывайте о том, что они вообще существуют.
 
Поэтому  "оцените эту красоту", это не красота, а пустые и неоправданные затраты.   
Ну а если говорить о парсере html-кода, то уже есть отличные классы готовые. Если расставить автоматом параграфы в тексте присылаемом клиентом, что может быть проще - примем во внимание, что параграф это двойной перевод строки, тогда:
 
echo '<p>'.implode('</p><p>', preg_split('/[\r\n]{2}|\n{2}/', htmlspecialchars($string), null, PREG_SPLIT_NO_EMPTY)).'</p>';
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				11.10.2016, 13:23
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 08.03.2015 
					
					
					
						Сообщений: 78
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		laimas,
 
Спасибо большое, за ваши советы. Не буду больше вас мучить. Надо углубляться в изучение.
 
Хочу задать последний вопрос, можно ли вот этот кусок кода, написать одной строчкой?
 
// Если пустых строк с тегом <br>, больше чем 1 подряд, убираем лишние и оставляем только одну
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
$content = preg_replace( '/(^\<br\>\r?\n^\<br\>\r?\n)/miu', "<br>\r\n", $content );
 
То есть два и более подряд идущих тега:
 
<br>
<br>
<br>
 
заменять на один:
 
<br>
 
Большое спасибо за помощь!  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				11.10.2016, 13:32
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.01.2015 
					
					
					
						Сообщений: 12,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от snovapavel
			
		
	 | 
 
	| 
		Если пустых строк с тегом <br>, больше чем 1 подряд, убираем лишние и оставляем только одну
	 | 
 
	
 
 Зачем, если изначально вы \r\n преобразовали в br? Не проще ли убрать лишние переводы строк, а затем nl2br? 
А если шерстить <br>, то зачем столько идентичных повторений? Ну и меняйте если более двух - '#<br[^>]*>{2,}#'. А такой \<br\>\r\n\<br\>\r\n бардак может получится, если только самому сильно захотеть.    Да еще и <br \> - это из какой спецификации?
 
PS. И я уже говорил, что "англицкий" он и в Африке "англицкий", проверьте этот пример в UTF:
 
$s = 'Рус Lat Pyc';
echo preg_replace('/Lat/', 'Eng', $s);
Как видите и без модификатора u проблем не будет. Вы шерстите теги, переносы, которые в многабайтной кодировке будут представлены также одним байтом. То же самое и с функциями строк - если использовать многие из них для поиска в UTF строке национального символа, то получим неверный результат, и надо использовать функции для работы с многобайтной кодировкой. Но если мы их используем для поиска не национальных символов, то проблем не будет.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось laimas, 11.10.2016 в 13:52.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				11.10.2016, 14:19
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 08.03.2015 
					
					
					
						Сообщений: 78
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от laimas
			 
		
	 | 
 
	| 
		Да еще и <br\> - это из какой спецификации?
	 | 
 
	
 
 Дак ведь спецсимвол же? Я когда учил регулярные выражения, там чётко говорилось - экранируйте всё подряд и у вас не будет проблем. И ещё рекомендовалось везде вставлять жадный оператор ?. Тогда точно проблем не будет. Вот и мучаюсь с тех пор с обратными слэшами и знаками вопроса.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				11.10.2016, 14:26
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.01.2015 
					
					
					
						Сообщений: 12,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от snovapavel
			
		
	 | 
 
	| 
		Дак ведь спецсимвол же?
	 | 
 
	
 
 <br\> - > спецсимовл? Нет.
 
	
 
	| 
		
			Сообщение от snovapavel
			
		
	 | 
 
	| 
		чётко говорилось - экранируйте всё подряд
	 | 
 
	
 
 Глупости.
 
	
 
	| 
		
			Сообщение от snovapavel
			
		
	 | 
 
	| 
		И ещё рекомендовалось везде вставлять жадный оператор ?
	 | 
 
	
 
 Тоже не верно, возможно вы не поняли сути.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |