PHPのpreg_split()でハイフンを基準に文字列を分割する方法
PHPのpreg_split()関数を使用すると、正規表現パターンに一致した区切り文字を基準に、文字列を配列へ分割できます。本記事では、ハイフン(-)を含む文字列を「直後に数字が続くハイフンだけ」を目安に分割する方法を解説します。
分割したい入力値
例として、次のように数字と文字列がハイフンで連結された入力値を想定します。
$values = "ABC-DEF IJKL-3553435-8990987876";
この文字列から、以下のような出力結果を得たいとします。
Array ( [0] => ABC-DEF IJKL [1] => 3553435 [2] => 8990987876 )
ポイントは、すべてのハイフンで分割するのではなく、直後に数字が続くハイフンだけを区切りとして扱うという点です。「ABC-DEF」のような部分は分割せず、そのまま1つの要素として残したいわけです。
サンプルコード
PHPのコードは以下の通りです。
<!DOCTYPE html>
<html>
<body>
<?php
$values = "ABC-DEF IJKL-3553435-8990987876";
$exploded = preg_split('/-(?=[0-9])/', $values, 3);
print_r($exploded);
?>
</body>
</html>
実行結果
上記のコードを実行すると、次の出力が得られます。
Array ( [0] => ABC-DEF IJKL [1] => 3553435 [2] => 8990987876 )
コードの解説
正規表現パターン「/-(?=[0-9])/」の意味
このパターンの鍵となるのが、先読みアサーション(lookahead)である「(?=[0-9])」です。
- - … ハイフンそのものに一致します。
- (?=[0-9]) … 直後の文字が数字(0〜9)である場合にのみマッチとみなす条件です。
つまり、「ABC-DEF」や「IJKL」の中にあるように直後に数字が続かないハイフンは区切りとして扱われず、「ABC-DEF IJKL」はそのまま1つの要素として保持されます。一方、「IJKL-3553435」や「3553435-8990987876」のように直後に数字が続くハイフンだけが分割位置になります。
第3引数「3」(limit)の役割
preg_split() の第3引数には、分割後の要素数の上限を指定できます。ここでは「3」を指定しているため、最大3つの要素に分割されます。仮に末尾の数値の中にさらにハイフンが含まれていても、それ以上分割されないため、意図した通りの結果が得られます。
まとめ
preg_split() は、単純な区切り文字の指定だけでなく、先読みアサーションを組み合わせることで「特定の条件を満たす区切り文字のみ」で柔軟に文字列を分割できる強力な関数です。ハイフン区切りのIDやデータの整形など、実務での文字列処理にぜひ活用してみてください。
-
PHPとMySQLで時刻を扱う方法|strtotime()とDATE_FORMAT()による形式変換
PHPで時刻形式を変換する方法 PHPで時刻データを扱う際、strtotime()関数を使えば、「8:55 PM」のような人間が読みやすい12時間制の表記を、データベースで扱いやすい24時間制(HH:MM:SS)へ簡単に変換できます。 PHPコード例 $timeValue = 8:55 PM; $changeTimeFormat = date(H:i:s, strtotime($timeValue)); echo(24時間制への変換結果=); echo($changeTimeFormat); このコードでは、まずstrtotime()が文字列「8:55 PM」をUNIXタイムスタンプに変換
-
SAPとPHPを統合する方法:RFCとWebサービスによる連携の基本
SAPとPHPの連携方法 SAPシステムとPHPアプリケーションを接続する手段はいくつか存在しますが、その中でも開発者の間で特に広く利用されているのがWebサービスとRFC(Remote Function Call:リモートファンクションコール)の2つです。 SAPRFC拡張モジュールとは SAPRFCは、PHP 4およびPHP 5向けに提供されている拡張モジュールです。このモジュールを活用することで、PHPスクリプトからSAP R/3上のABAPファンクションモジュールを直接呼び出すことが可能になります。 主な活用シーン Webアプリケーションの構築: PHP言語を使用して、SAP R