Пропускать слова / фразы, если в кавычках при выполнении замены / удаления строки - PullRequest
0 голосов
/ 04 июня 2018

Допустим, у меня есть такая строка

Я летаю из "Детройта в Ванкувер" в июле этого года

$string = 'I am flying from "Detroit to Vancouver" this July';

У меня также есть массив "stopwords "(слова, которые я выбираю для удаления из строки / строк)

$stopwords = array( "to", "anotherstopword", "andanother" )

Сейчас я просто использую

$string = str_replace($stopwords, ' ', $string);

Это, конечно, дает мне string(33) "I am flying from "Detroit Vancouver" this July"

Я думал о том, чтобы взорвать $string с пробелом перед str_replace, давая мне что-то вроде

Array
(
    [0] => I
    [1] => am
    [2] => flying
    [3] => from
    [4] => "Detroit
    [5] => to
    [6] => Vancouver"
    [7] => this
    [8] => July
)

Затем, возможно, удалив их из массива, выполнивзаменить и снова вставить их ... но это кажется излишним

Я также думал об использовании такой функции

  function getStringBetween($str, $from, $to, $withFromAndTo = false)
  {
      $sub = substr($str, strpos($str, $from) + strlen($from), strlen($str));
      if ($withFromAndTo)
          return $from . substr($sub, 0, strrpos($sub, $to)) . $to;
      else
          return substr($sub, 0, strrpos($sub, $to));
  }

При этом

<code>    echo '<pre>';
    print_r(getStringBetween($string, '"', '"'));
    echo '
';

Выходы:

Детройт в Ванкувер

И выполнение некоторого типа условия игнорирования перед str_replace ..

Но это терпит неудачу всякий раз, когда в строке есть несколько кавычек ..

В идеале я хотел бы создать условие, где, если строка содержит двойные кавычки, полностью игнорировать их в процессе str_replace.

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

Может кто-нибудь придумать хороший способигнорировать стоп-слова / слова, которые нужно удалить перед заменой?

РЕДАКТИРОВАТЬ:

Пример кода

<?php

  $stopwordstest = array( " to ", " a ", " test " );

  $string = 'I am flying from "Detroit to Vancouver" this July when the weather is test nice';

  var_dump($string);

// as is, without string replace
// string(79) "I am flying from "Detroit to Vancouver" this July when the weather is test nice" 

  $string = str_replace($stopwordstest, ' ', $string);

  echo '<br><br>';

  var_dump($string);

// string(71) "I am flying from "Detroit Vancouver" this July when the weather is nice"

// Expected output is:
//
// string(74) "I am flying from "Detroit to Vancouver" this July when the weather is nice"
//

?>

Другими словами, я хотел бы заменить строкуидти вперед, как и предполагалось, но так как слово to заключено в кавычки ("Detroit to Vancouver"), оно должно пропустить это слово, потому что оно в кавычках.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Это было бы легко с помощью регулярных выражений, проще с использованием PHP (PCRE).С помощью PCRE у вас есть возможность сопоставлять и пропускать, используя глагол (*SKIP) backtracking.Вы сопоставляете строку в двойных кавычках, затем делаете движок, чтобы пропустить эту часть из общего совпадения, и вводите желаемый шаблон во второй части чередования.

"[^"\\]*(?:\\.[^"\\]*)*"(*SKIP)(*F)

Выше регулярное выражение соответствует строке в двойных кавычках (включая экранированные двойные кавычки), а затем говорит движку забыть.

Это будет PHP-код, который реализует эту функцию вместе со сбором стоп-слов в регулярном выражении:

echo preg_replace('/"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"(*SKIP)(*F)|\b(?:'
    . implode('|', array_map('preg_quote', $stopwords))
    . ')\b\h*/', '', $string);

Live demo

0 голосов
/ 04 июня 2018
foreach ($stopwords as &$stopword) {
    $string = str_replace($stopword, ' ', $string);
}
...