🤖
PHPのFFIからRustで作成したコードを呼び出す
FFIについて、Rustからもできるのではないかと考えてあれこれ試しています。
文字列の受け取りについてやり方をまずは調べようと「わざわざFFIでやる意味があるのか」はいったん棚に上げて書いてみた。
Rust
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
<?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」も含まれるのは驚いた
Discussion