質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

720閲覧

PHP, preg_replace 置き換え前の文字が前後に残る

nekoyama7

総合スコア200

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/07/24 06:04

こんにちは。preg_replace の動作がおかしいので困っています。

正規表現でマッチした場合、置き換えられた文字列の前後に、置き換えられる前の文字列が残っています。

古い文字列
"ねこ温泉に行く"

新しく置き換えられた文字列
"Dog or Cat Hot Spring"

ところが、結果は
"ねDog or Cat Hot Springに行く"
と表示されます。

FireFox, Safari のスクリーンショット画像も同じ現象です。
イメージ説明
イメージ説明
preg_replace でエラーが出てないかのチェックも、プログラムに含まれていますが、エラーは出ていません。

php

1<?php 2function replace_001($subject){ 3 4 $pattern = "/[いぬ|ねこ]温泉/u"; 5 $replacement = "Dog or Cat Hot Spring"; 6 $result = preg_replace($pattern, $replacement, $subject); 7 8 // エラーに備える 9 // 置き換えられた値を返す 10 if (is_null($result)) { 11 return "エラー:" . preg_last_error(); 12 } else if ($result == $subject) { 13 return "マッチしなかった"; 14 } else { 15 return $result; 16 } 17} 18// 英語に 19$onsen_01 = "ねこ温泉に行く"; 20$onsen_02 = "くま温泉に行く"; 21$onsen_ty_01 = replace_001($onsen_01); 22$onsen_ty_02 = replace_001($onsen_02); 23echo "{$onsen_01}--は、次のようになります。\n"; 24echo $onsen_ty_01, "\n"; 25echo "{$onsen_02}--は、次のようになります。\n"; 26echo $onsen_ty_02, "\n"; 27?>

mac OS Mojave---最新
Firefox---最新
Safari---最新

MAMP---ver 5.3
php---version 7.3.1
MySQL---ver 5.7.25

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoorwm

2019/07/24 06:07

>preg_replace の動作がおかしいので困っています 正規表現おかしいですね。
m.ts10806

2019/07/24 06:11

今のままですと「に行く」はどうやっても変換されませんよ。
nekoyama7

2019/07/24 11:01

自己解決の記入欄なので、うまく返信されるかわかりませんが。 回答ありがとうございます。古い文字列が消えて、新しい文字列と置き換わるわけではないんですね。だから「に行く」が残るんですね。
guest

回答1

0

ベストアンサー

$pattern = "/[いぬ|ねこ]温泉/u";
↓↓↓
$pattern = "/(いぬ|ねこ)温泉/u";

命題の[]での評価は羅列された文字列の内1文字のみ評価対象となるので

  • い温泉
  • ぬ温泉
  • |温泉
  • ね温泉
  • こ温泉

にヒットして入れ替えるので当然「ね」は残ります

投稿2019/07/24 06:09

編集2019/07/24 06:10
yambejp

総合スコア114761

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問