2014-10-25 1 views
1

У меня есть строка, форматированная символами (символами, аналогичными тем, которые используются для форматирования вопросов на этом сайте).Заменить символы в строке, зависящей от вхождения. PHP

Правила:

  1. ** Hello ** означает полужирный = < б> Здравствуйте </б>

  2. * Hello \\ означает маркированный список = < литий> Здравствуйте </li>

  3. Здравствуйте \\ означает разрыв линии = Hello < бр>

Я хочу заменить:

  1. Каждый первое вхождение ** с < Ь> и каждый второй ** с </b>.
  2. То же самое для * с < li> и \\ с </li>.
  3. Все \\, которые встречаются без * где-то в строке перед, должны быть преобразованы в < br>.

Пример строки:

$myString = 'Hello my **Friend**,\\here is the stuff you need to buy for me:*knife\\*water bottle\\***fake ID**\\\\\\Thank you in advance and don not forget the **fake ID**!\\Sincerely yours\\Eddy' 

Примечание: Этот стиль не мое изобретение. Он используется, и я должен его преобразовать.

I preg_match() - его части, чтобы получить материал между тегами.

$myString = 'Hello my **Friend**,\\here is the stuff you need to buy for me:*knife\\*water bottle\\***fake ID**\\\\\\Thank you in advance and don not forget the **fake ID**!\\Sincerely yours\\Eddy'; 
     $result = array(); 
     $firstBold = '<b>'. preg_match('~\*\*(.*?)\*\*~', $myString, $firstBold) . </b>; 
     $result += $firstBold 
     // and so on... 

(Игнорировать ошибки в этом, его написано из памяти)

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

Каков наилучший способ решить эту проблему на PHP?

+0

'$ туЗЬптд = $ туЗЬптд = ...' Я полагаю, что это ошибка? – Bijan

+0

О, да, действительно. Изменено. Спасибо! – Allinternal

ответ

1

Вы можете использовать preg_replace. из-за вашей разметки ваш заказ замены будет иметь значение.

http://php.net/manual/en/function.preg-replace.php

$myString = preg_replace("/[*][*]([^*]+)[*][*]/",'<b>${1}</b>',$myString); 
$myString = preg_replace("/[*]([^\/]+)[\/][\/]/",'<li>${1}</li>',$myString); 
$myString = str_replace("//",'<br/>',$myString); 
+0

Это очень умное решение разрешило это. Мне пришлось немного изменить его, чтобы он соответствовал обратным слэшам вместо косых черт. Теперь это выглядит так: '$ myString = preg_replace ("/[*] [*] ([^ *] +) [*] [*]/", '$ {1', $ myString) ; $ myString = preg_replace ("/ [*] ([^ \\\] +) [\\\] /", '

  • $ {1
  • ', $ myString); $ myString = str_replace ("\\", '
    ', $ myString); ' – Allinternal

    Смежные вопросы