у меня есть
$text = '--ACT-- active --INA-- inactive';
я хочу заменить --ACT- и -INA- на значение, которое я сделал:
str_replace(array('--ACT--','--INA--'), array('<div class = "wp"><b>1</b></div>','<div class = "wp"><b>2</b></div>'), $text);
результаты
<div class = "wp"><b>1</b></div> Active
<div class = "wp"><b>2</b></div> inactive
но я хочу добавить текст активный и неактивный внутри div, а не за его пределами, например:
<div class = "wp"><b>1</b> active</div>
Я не хочу добавлять этот текст в str_replace, я хочу получить его из переменной $ text, нужна помощь?
Нет, как я уже сказал, я не хочу добавлять этот текст в str_replace, я все равно хочу получить его из переменной $ text?
Могу я спросить, почему вы не хотите делать это самым простым и очевидным способом? Если вы намекнете, почему и что вы пытаетесь решить, нам будет легче придумать правильное предложение.
В этом случае вам нужно регулярное выражение preg_replace
@ Андрей, пожалуйста? есть ли способ сделать это без preg_replace, я хочу str_replace
Невозможно. Могу выложить preg_replace. Но str_replace невозможно или, по крайней мере, чрезвычайно сложно
ок, как с preg_replace?






Используйте preg_replace, запишите слово после ACT / INA и поместите вокруг него html.
$text = '--ACT-- active --INA-- inactive';
// Add html to active
$text = preg_replace("/--ACT-- (\w+)/" , '<div class = "wp"><b>1</b>$1</div>',$text);
// Add html to inactive and echo
Echo preg_replace("/--INA-- (\w+)/" , '<div class = "wp"><b>2</b>$1</div>',$text);
Предполагается, что это только одно слово после ACT. Если это неверно, обновите свой вопрос более подходящим примером.
спасибо, но как использовать в одной строке, как я сделал в str_replace?
Вы не можете, поэтому я разместил две строчки. У вас проблема с доверием. Замены не совпадают, поэтому я не могу заменить его тем же html. С активным вы хотите 1 с неактивным 2, я не могу адаптировать код для этого.
хорошо, извините, потому что проблема, которую я хочу в одной строке, а не две, или ... я ищу другой метод, спасибо andreas
У вас может быть одна очень грязная строчка Echo preg_replace("/--INA-- (\w+)/" , '<div class = "wp"><b>2</b>$1</div>',preg_replace("/--ACT-- (\w+)/" , '<div class = "wp"><b>1</b>$1</div>',$text));
нужно повторить preg_match? потому что эта функция имеет низкую скорость, и я не хочу повторять ее дважды.
@JohnJack "потому что эта функция имеет низкую скорость" - В строках такого размера я сомневаюсь, что вы когда-нибудь заметите какую-либо разницу, если только вы не повторите приведенный выше код многие раз за запрос.
Чтобы избежать цепного выполнения, вы должны окружить шаблоны .*, например /.*--INA-- (\w+).*/.
@Theofanis приковал казнь? Что ты имеешь в виду? Это полностью уничтожит регулярное выражение 3v4l.org/v7BMU.
@Andreas, вам нужно специально выполнить его два раза, повторно подключив предыдущий вывод ко второму, иначе вывод будет недопустимым, как --ACT-- active <div class = "wp"><b>2</b>inactive</div> или <div class = "wp"><b>1</b>active</div> --INA-- inactive
@Theofanis - Если вы посмотрите на код, он сначала заменяет ACT, затем он использует этот результат и заменяет INACT (который до сих пор не был заменен). Вы также можете проверить ссылку, которую добавил Андреас. Не знаете, в чем состоит возражение?
@Andreas проверено, и если у него есть два слова после значения, это не сработает, а второе слово будет вне теста div с этим $ text = '--ACT-- active user --INA-- inactive';
Я знаю. Из ответа: Предполагается, что это только одно слово после ACT. Если это неверно, обновите свой вопрос более подходящим примером.
Простое решение:
$text = '--ACT-- active --INA-- inactive';
$textAfter= preg_replace('/--ACT-- +(\w+) +--INA-- +(\w+)/',
'<div class = "wp"><b>1</b>${1}</div> <div class = "wp"><b>2</b>${2}</div>',
$text);
echo $textAfter;
//prints: <div class = "wp"><b>1</b>active</div> <div class = "wp"><b>2</b>inactive</div>
Основанное на этом полезное решение:
function param($text, $name, $transformation) {
return preg_replace("/.*$name +(\w+).*/",$transformation, $text);
}
$text = '--ACT-- active --INA-- inactive';
echo param($text,'--ACT--','<div class = "wp"><b>1</b>${1}</div>');
//prints: <div class = "wp"><b>1</b>active</div>
echo param($text,'--INA--','<div class = "wp"><b>2</b>${1}</div>');
//prints: <div class = "wp"><b>2</b>inactive</div>
для первого, если у меня их три, что мне писать в preg_replace? "/ - ACT-- + (\ w +) + - INA-- + (\ w +) + - EDI-- + (\ w +) /" правильно?
@JohnJack Исправьте и соответственно измените замену, например, $textAfter = preg_replace('/--ACT-- +(\w+) +--INA-- +(\w+) +--EDI-- +(\w+)/', '<div class = "wp"><b>1</b>${1}</div> <div class = "wp"><b>2</b>${2}</div> <div class = "wp"><b>3</b>${3}</div>', $text);
спасибо, но что-то пропустил и не работает, работает только если одно слово после значения, но если это $ text = '--ACT-- active --INA-- неактивный пользователь'; не работает? какие-либо предложения?
@JohnJack заменяет (\w+) на ((\w+\s?)+), поэтому $textAfter = preg_replace('/--ACT-- +((\w+\s?)+) +--INA-- +((\w+\s?)+) +--EDI-- +((\w+\s?)+)/', '<div class = "wp"><b>1</b>${1}</div> <div class = "wp"><b>2</b>${3}</div> <div class = "wp"><b>3</b>${6}</div>', $text);
$ text = '--ACT-- активный --INA-- неактивный пользователь --EDI-- Забаненный пользователь'; протестируйте с этим, и вы увидите, что это не работает. что не так?
@JohnJack, извините за ошибку, измените эту часть <div class = "wp"><b>3</b>${6}</div> с этой заменой, параметры должны увеличиться на два, начиная с 1
спасибо за все ваши ответы. да, это то, что я уже сделал, и это работает. но я все еще изучаю, как это сделать таким образом str_replace (array ('- ACT -', '- INA--'), array ('<div class = "wp"> <b> 1 < / b> </div> ',' <div class = "wp"> <b> 2 </b> </div> '), $ text); надеюсь найти что-то, потому что preg_replace немного медленнее .. я хочу использовать str_replace
Этот шаблон удалит текст между -- и вставит следующий текст в ваш <div>:
$text = '--ACT-- active --INA-- inactive';
$new_text = preg_replace(
'/((--[A-Z]{3}--) (\w+))/',
'<div class = "wp"><b>1</b> ${3}</div>',
$text
);
echo $new_text;
Это неверно. Он запрашивает другой вывод для каждого параметра <b>1</b>, <b>2</b>.
Ну что ж, извините. Это было мое первое регулярное выражение, я постараюсь получить то, что вы ищете, как можно скорее.
Альтернативный (не рекомендуется) метод с одним вызовом preg_replace при отсутствии дубликатов
$text = '--ACT-- active --INA-- inactive';
$text = preg_replace('/ *--(\w+)-- */', '&$1=', trim($text)); // transform to url params
parse_str($text, $data);
var_dump($data);
/* Output
array(2) {
["ACT"]=>
string(6) "active"
["INA"]=>
string(8) "inactive"
}
*/
function format($data,$key,$transformation) {
$parts = explode('%%', $transformation);
return $parts[0].$data[$key].$parts[1];
}
echo format($data,'ACT','<div class = "wp"><b>1</b>%%</div>');
//prints: <div class = "wp"><b>1</b>active</div>
echo format($data,'INA','<div class = "wp"><b>2</b>%%</div>');
//prints: <div class = "wp"><b>2</b>inactive</div>
@JohnJack Вы можете сделать это с str_replace, выполнив https://3v4l.org/lj6ct
$text = '--ACT-- active --INA-- inactive user --EDI-- Banned user';
$text = str_replace(array('--ACT--','--INA--','--EDI--','%%'), array('<div class = "wp"><b>1</b>','%%<div class = "wp"><b>2</b>','%%<div class = "wp"><b>3</b>','</div>'), $text.'%%');
print $text;
//prints: <div class = "wp"><b>1</b> active </div><div class = "wp"><b>2</b> inactive user </div><div class = "wp"><b>3</b> Banned user</div>
Это ужасная идея, но она работает.
@JohnJack Не знаю, как это объяснить. Я просто смотрю на это, и это кажется неправильным. Но убедитесь, что на входе нет %%, иначе вы должны изменить последний поисковый запрос и соответствующие замены.
Затем замените все это:
str_replace('--ACT-- active', '<div class = "wp"><b>1</b> Active</div>', $text);(но с массивом для покрытия обоих, как вы уже делаете).