PHPのFFIからRustで作成したコードを呼び出す

公開:2020/10/28
更新:2020/10/28
1 min読了の目安(約800字TECH技術記事

FFIについて、Rustからもできるのではないかと考えてあれこれ試しています。
文字列の受け取りについてやり方をまずは調べようと「わざわざFFIでやる意味があるのか」はいったん棚に上げて書いてみた。

Rust

extern crate regex;
use regex::Regex;
use std::os::raw::c_char;
use std::ffi::CStr;
#[no_mangle]
pub extern fn hasNumeric(c_string:*const c_char) -> bool{
  //  Regex
  let regex_match = Regex::new(r"\d+").unwrap();
  let converted = unsafe { CStr::from_ptr(c_string).to_str().unwrap() };
  match regex_match.find(converted) {
    Some(_pos) => true,
    None       => false
  }
}

PHP

<?php
$ffi = FFI::cdef('bool hasNumeric(const char*);', './libffi.so');

実際に判定させてみる

var_dump($ffi->hasNumeric("whoami"));
var_dump($ffi->hasNumeric("whoami 34"));
var_dump($ffi->hasNumeric("whoami 4"));
var_dump($ffi->hasNumeric("四 four"));

結果

bool(false)
bool(true)
bool(true)
bool(false)

全角の「4」も含まれるのは驚いた