На основе описания библиотеки *1003* библиотеки RedCloth , с некоторыми изменениями для двойной черты.
@
(?<!\S) # Start of string, or after space or newline
- # Opening dash
( # Capture group 1
(?: # : (see note 1)
[^-\s]+ # :
[-\s]+ # :
)*? # :
[^-\s]+? # :
) # End
- # Closing dash
(?![^\s!"\#$%&',\-./:;=?\\^`|~[\]()<]) # (see note 2)
@x
- Примечание 1: Это должно соответствовать следующему тире лениво, потребляя при этом любые не одиночные тире и одиночные тире, окруженные пробелами.
- Примечание 2: После пробела, пунктуации, переноса строкиили конец строки.
Или сжатый:
@(?<!\S)-((?:[^-\s]+[-\s]+)*?[^-\s]+?)-(?![^\s!"#$%&',\-./:;=?\\^`|~[\]()<])@
Несколько примеров:
$regex = '@(?<!\S)-((?:[^-\s]+[-\s]+)*?[^-\s]+?)-(?![^\s!"#$%&\',\-./:;=?\\\^`|~[\]()<])@';
$replacement = '<del>\1</del>';
preg_replace($regex, $replacement, '-*deleted* -- text- and -more deleted text-'), "\n";
preg_replace($regex, $replacement, '-*deleted*--text- and -more deleted text-'), "\n";
preg_replace($regex, $replacement, '-american-football player-'), "\n";
Будет выводить:
<del>*deleted* -- text</del> and <del>more deleted text</del>
<del>*deleted*</del>-text- and <del>more deleted text</del>
<del>american-football player</del>
Во втором примере он будет соответствовать -*deleted*-
, поскольку до --
нет пробелов.-text-
не будет сопоставлено, потому что начальному -
не предшествует пробел.