JavaScript replace/regex

Примечание: преобразование массива в строку

Это просто происходит, если вы пытаетесь обработать массив как строку:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Массив не может быть просто echo 'd или сцепленным со строкой, потому что результат не очень хорошо определен. PHP будет использовать строку «Array» вместо массива и инициировать уведомление, чтобы указать, что это, вероятно, не то, что было задумано, и что вы должны проверять свой код здесь. Вы, вероятно, хотите что-то вроде этого:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Или зациклите массив:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

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

99
задан Joe 30 June 2013 в 15:58
поделиться

3 ответа

Вам нужно дважды экранировать любые символы RegExp (один раз для косая черта в строке и один раз для регулярного выражения):

  "$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")

В противном случае он ищет конец строки и «ТЕСТОН» (который никогда не находит).

Лично я не большой поклонник построения По этой причине в regexp используются строки. Необходимый уровень побега может привести к выпивке. Я уверен, что другие думают иначе и любят пить, когда пишут регулярные выражения.

133
ответ дан 24 November 2019 в 05:00
поделиться

С точки зрения интерпретации шаблона, нет никакой разницы между следующими формами:

  • / pattern /
  • new RegExp («шаблон»)

Если вы хотите заменить литерал строка с использованием метода replace , я думаю, вы можете просто передать строку вместо регулярного выражения в replace .

В противном случае вам придется экранировать любые специальные символы регулярного выражения в сначала шаблон - может быть, так:

function reEscape(s) {
    return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1");
}

// ...

var re = new RegExp(reEscape(pattern), "mg");
this.markup = this.markup.replace(re, value);
70
ответ дан 24 November 2019 в 05:00
поделиться

Ваш шаблон регулярного выражения должен иметь модификатор g:

var pattern = /[somepattern]+/g;

обратите внимание на g в конце. он сообщает заменителю выполнить глобальную замену.

Также вам не нужно использовать объект RegExp, вы можете создать свой шаблон, как указано выше. Пример шаблона:

var pattern = /[0-9a-zA-Z]+/g;

шаблон всегда окружен символом / с обеих сторон - с модификаторами после последнего /, модификатор g является глобальным.

РЕДАКТИРОВАТЬ: Почему это важно, если шаблон является переменной? В вашем случае это будет работать следующим образом (обратите внимание, что шаблон все еще является переменной):

var pattern = /[0-9a-zA-Z]+/g;
repeater.replace(pattern, "1234abc");

Но вам нужно будет изменить функцию замены на это:

this.markup = this.markup.replace(pattern, value);
27
ответ дан 24 November 2019 в 05:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: