2016-09-21 3 views
1

Возможно, эта проблема не может быть решена, как я хочу, но, возможно, вы можете помочь мне, ребята.Правила регулярного выражения в массиве

У меня много искаженных слов от имени моих продуктов.

Некоторые из них имеют ведущие и ведомые () или, возможно, один из них, то же самое для / и " знаков.

Что я делаю, так это то, что я взорвую имя продукта по пробелам и исследую эти слова.

Поэтому я хочу заменить их на ничего. Но жесткий диск может быть 40GB ATA 3.5" hard drive. Мне нужно обработать все слова, но я не могу использовать тот же метод для 3.5", как и для () или //, потому что этот 3.5" действителен.

Поэтому мне нужно только заменить кавычки, когда она находится в начале строки И в конце строки.

$cases = [ 
    '(testone)', 
    '(testtwo', 
    'testthree)', 
    '/otherone/', 
    '/othertwo', 
    'otherthree/', 
    '"anotherone', 
    'anothertwo"', 
    '"anotherthree"', 
]; 
$patterns = [ 
    '/^\(/', 
    '/\)$/', 
    '~^/~', 
    '~/$~', 
    //Here is what I can not imagine, how to add the rule for `"` 
]; 
$result = preg_replace($patterns, '', $cases); 

Это хорошо работает, но это может быть сделано в одном regex_replace()? Если да, кто-то может помочь мне в шаблонах (-ах) для цитат?

Результат для котировок должен быть таким:

'"anotherone', //no quote at end leave the leading 
'anothertwo"', //no quote at start leave the trailin 
'anotherthree', //there are quotes on start and end so remove them. 
+0

Означает ли это, что вам нужно 2 регэкспы - 1) для начального '» 'если строка заканчивается символом' '' '' '/^"(?=.*"$)/ s'' и 2) для завершающего' '', если первый был '' '(никакой способ для текущего подход)? –

+0

@ WiktorStribiżew Цитаты могут быть заменены только в том случае, если первым символом является символ '' 'и последний символ' '' quote тоже, и shold заменить только эти 2 кавычки. – vaso123

ответ

1

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

preg_replace('~^[(/]|[/)]$|^"(.*)"$~s', '$1', $s) 

regex demo

Детали:

  • ^[(/] - буквальный ( или / в начале строки
  • | - или
  • [/)]$ - буквальный ) или / в конце строки
  • | - или
  • ^"(.*)"$ - a " в начале строки, то любые символы 0+ (из-за опции /s, . также соответствуют последовательности строк), которые записываются в группу 1 и " в конце строки.

Образец замены $1, который пуст, когда сопоставляются первые 2 альтернативы, и содержит значение группы 1, если указан третий вариант.

Примечание: В случае, если вам нужно заменить, пока совпадение не найдено, используйте preg_match с preg_replace вместе (см demo):

$s = '"/some text/"'; 
$re = '~^[(/]|[/)]$|^"(.*)"$~s'; 
$tmp = ''; 
while (preg_match($re, $s) && $tmp != $s) { 
    $tmp = $s; 
    $s = preg_replace($re, '$1', $s); 
} 
echo $s; 
+1

Он отлично работает ... Спасибо! Я рад восстановить пост и принять ваш ответ. – vaso123

+0

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

+0

Извините, конечно. Если вы проверите мою историю, вы увидите, что я не очень разбираюсь в вопросе: (Просто не понял причины. Конечно, я буду рад прояснить любые сомнения. –

0

Это работает

preg_replace([[/(]?(.+)[/)]?|/\"(.+)\"/], '$1', $string) 
+0

Да, но его нельзя смешивать с массивом '$ pattersn', потому что в другом случае я заменяю результаты на ничего, а вы за' '$ 1'' – vaso123

+0

Я отредактировал ответ на работу за один раз. это нормально? –

+0

, и вы можете использовать этот сайт, чтобы проверить его https://www.functions-online.com/preg_replace.html –

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